1. 설계 로직
- 입력된 숫자를 정렬합니다.
- 2개의 숫자를 뽑았을 때의 합이 0에 가까울 때를 찾아야하므로, 투포인터를 사용합니다.
- 맨 왼쪽, 맨 오른쪽 값을 구하고, 만약 이 값이 0이라면 answer에 담아서 반복문을 종료합니다.
- 현재 선택된 2개의 값의 합의 절댓값이 이전에 구한 합보다 더 작다면 해당 값을 answer에 담고, 해당 값이 음수면 left값을 오른쪽으로 한 칸 옮기고, 해당 값이 양수라면 right 값을 왼쪽으로 한 칸 옮깁니다.
- left가 right보다 작다면 위의 2를 반복합니다.
- 시간복잡도 : O(NlogN)
2. 코드
N = int(input())
nums = sorted(list(map(int, input().split())))
left, right = 0, N-1
value = 1e9 * 2 + 1
answer = [nums[left], nums[right]]
while left < right:
_left, _right = nums[left], nums[right]
tmp = _left + _right
if abs(value) > abs(tmp):
answer = [_left, _right]
value = tmp
if tmp == 0:
break
elif tmp < 0:
left += 1
else:
right -= 1
print(*answer)
3. 후기
지금보니 어차피 value의 초깃값이 1e9*2+1이라서 answer의 초깃값에 left, right를 안넣어놔도 될 것 같네여!
'Algorithm > Python' 카테고리의 다른 글
[백준 17485] 진우의 달 여행 (Large) (0) | 2021.12.13 |
---|---|
[백준 1726] 로봇 (6) | 2021.11.21 |
[백준 14675] 단절점과 단절선 (0) | 2021.10.13 |
[백준 1389] 케빈 베이컨의 6단계 법칙 (0) | 2021.09.05 |
[위클리 챌린지-3주차] 퍼즐 조각 채우기 (0) | 2021.08.23 |