1번째부터 n-1번째 수들마다 오른쪽에 있는 용액들을 이분탐색해서 합이 0에 가까운 수를 찾고 기존 답과 비교하는 형식으로 풀었다.
import sys
n=int(input())
li=list(map(int,sys.stdin.readline().split(" ")))
a,b=10**9,10**9
for i in range(n-1):
target=-li[i]
l=i+1
r=n-1
while l<=r:
mid=(l+r)//2
if target==li[mid]:
a,b=li[i],-li[i]
break
elif target<li[mid]:
r=mid-1
else:
l=mid+1
if i<l<n and abs(li[i]+li[l])<abs(a+b):
a,b=li[i],li[l]
if i<r<n and abs(li[i]+li[r])<abs(a+b):
a,b=li[i],li[r]
print(a,b)
구글링을 해보니 이분탐색이 아닌 투포인터로도 풀이가 가능했다. 왼쪽 인덱스와 오른쪽 인덱스에 해당하는 두 값의 합을 기존 답과 비교한다. 또한, 두 값의 합에 따라 왼쪽 인덱스를 늘리거나 오른쪽 인덱스를 줄인다.
import sys
n=int(input())
li=list(map(int,sys.stdin.readline().split(" ")))
a,b=10**9,10**9
l,r=0,n-1
while l<r:
if abs(li[l]+li[r])<abs(a+b):
a,b=li[l],li[r]
if a+b==0:
break
if li[l]+li[r]<0:
l+=1
elif li[l]+li[r]>0:
r-=1
print(a,b)