반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 재귀
- programmers
- 다이나믹 프로그래밍
- 스택
- dfs
- level1
- 에라스토테네스의 체
- 투포인터
- 백준
- 파이썬
- 구현
- 힙
- 가상메모리
- BFS
- DP
- N과M
- BOJ
- 브루트포스
- 딕셔너리
- python
- 그리디
- MYSQL
- 프로그래머스
- 코딩테스트
- 가상메모리 관리
- 수학
- 운영체제
- 다익스트라
- level2
- level3
Archives
- Today
- Total
동캄의 코딩도장
백준 2295 [세 수의 합] 파이썬 본문
반응형
https://www.acmicpc.net/problem/2295
import sys
# 수의 개수 입력
N = int(sys.stdin.readline())
# 입력된 수들을 저장할 리스트
nums = []
# 수들을 입력받아서 리스트에 저장
for _ in range(N):
num = int(sys.stdin.readline())
nums.append(num)
# 오름차순 정렬
nums.sort()
# 가장 큰 수부터 하나씩 선택해서 검사
for i in range(N-1, -1, -1):
target = nums[i] # 현재 검사하려는 목표 수 (세 수의 합이 되어야 하는 값)
# target보다 작은 수들 중에서 두 수의 합과 비교
for j in range(i-1, -1, -1): # 두 번째 수 선택
left = 0
right = j # 투포인터 범위는 j까지 (j보다 큰 수는 사용할 수 없음)
third = nums[j] # 세 번째 수 (중간 수)
# 투포인터로 나머지 두 수를 선택
while left <= right:
s = nums[left] + nums[right] + third # 세 수의 합
if target == s:
print(target) # 조건 만족하는 가장 큰 수 출력
exit(0) # 바로 종료
elif s < target:
left += 1 # 합이 작으면 왼쪽 포인터 증가
elif s > target:
right -= 1 # 합이 크면 오른쪽 포인터 감소
O(N^2 log N)의 복잡도로 해결하였다.
더 깔끔하게 해결 한 분이 계셔서 코드를 첨부한다.
import sys
input=sys.stdin.readline
N=int(input())
arr=set()
for _ in range(N):
arr.add(int(input()))
sums=set()
for i in arr:
for j in arr:
sums.add(i+j)
ans=set()
for i in arr:
for j in arr:
if i-j in sums:
ans.add(i)
print(max(ans))
두 수의 합을 미리 저장하여 해결하였다.
반응형
'코테 > BOJ' 카테고리의 다른 글
백준 1806 [부분 합] 파이썬 (0) | 2025.06.19 |
---|---|
백준 2143 [두 배열의 합] 파이썬 (0) | 2025.06.19 |
백준 1253 [좋다] 파이썬 (0) | 2025.06.16 |
백준 2473 [세 용액] 파이썬 (0) | 2025.06.16 |
백준 3151 [합이 0] 파이썬 (0) | 2025.06.15 |