우선 정렬과 투포인터를 생각할 수 있다. 두 값을 더해 0에 가까운 값을 만들어야 한다.
두 용액을 더해서 절댓값을 취한 값이 현재 가지고 있는 min값보다 작을 경우 갱신해준다.
이때 더한 값에 따라 왼쪽과 오른쪽 포인터의 값을 어떻게 이동할지가 달라진다.
0일 경우
best값이기 때문에 더이상 볼 필요가 없으므로 break 한다.
0보다 클 경우
값을 줄여야 하기 때문에 오른쪽 포인터를 한칸 줄인다.
0보다 작을 경우
값을 늘려야 하기 때문에 왼쪽 포인터를 한칸 늘린다.
N = int(input())
nums = list(map(int, input().split()))
l, r = 0, N-1
ans = float('inf')
a, b = 0, 0
while l < r:
sums = nums[l]+nums[r]
if abs(sums) < ans:
ans = abs(sums)
a, b = l, r
if sums == 0: break
elif sums > 0: r -= 1
else: l += 1
print(nums[a], nums[b])