import sys
# 입력
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
# 투 포인터로 접근하기 위해 주어진 특성값들을 오름차순 정렬한다.
arr.sort()
left = 0
right = n - 1
# closest_sum: 혼합 특성값의 최적 값
closest_sum = float('inf')
# answer: closest_sum을 만들 수 있는 두 용액의 특성값
answer = (0, 0)
while left < right:
current_sum = arr[left] + arr[right]
# 두 용액의 특성값 합의 절댓값이 closest_sum의 절댓값보다 작다면, closest_sum, answer를 업데이트한다.
if abs(current_sum) < abs(closest_sum):
closest_sum = current_sum
answer = (arr[left], arr[right])
# current_sum에 따라 포인터를 이동시킨다.
if current_sum < 0:
left += 1
elif current_sum > 0:
right -= 1
else:
break
# 출력
print(*answer)
참고로 위의 문제에서 사용한 투 포인터(Two Pointer) 알고리즘은..
정렬된 배열에서 두 포인터를 사용해 특정 조건(부분 합, 구간의 길이, 쌍의 합 등)을 만족하는 값을 찾는 문제에서 많이 쓰인다.
조건에 따라 포인터를 한 방향(또는 서로 다른 방향)으로 이동시키면 된다.