Algorithm/Python

[백준 2470] 두 용액

🥭맹2 2021. 12. 13. 21:56

문제 링크

1. 설계 로직

  1. 입력된 숫자를 정렬합니다.
  2. 2개의 숫자를 뽑았을 때의 합이 0에 가까울 때를 찾아야하므로, 투포인터를 사용합니다.
    1. 맨 왼쪽, 맨 오른쪽 값을 구하고, 만약 이 값이 0이라면 answer에 담아서 반복문을 종료합니다.
    2. 현재 선택된 2개의 값의 합의 절댓값이 이전에 구한 합보다 더 작다면 해당 값을 answer에 담고, 해당 값이 음수면 left값을 오른쪽으로 한 칸 옮기고, 해당 값이 양수라면 right 값을 왼쪽으로 한 칸 옮깁니다.
    3. 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를 안넣어놔도 될 것 같네여!