포인터를 각각 배열의 왼쪽, 오른쪽 부분에서 시작하도록 설정하고 두 포인터가 엇갈리지 않을 때까지 포인터가 가리키는 각 배열의 값의 합의 최솟값을 갱신합니다. 값을 갱신할 때는 0에 수렴하는 값을 넣어줘야 하므로 절댓값으로 바꿔 넣어줍니다.
현재 순회중인 각 포인터가 가리키는 배열의 합이 0보다 큰 경우 오른쪽(큰 값)값을 줄여줘야 하므로 오른쪽 포인터를 감소하고 0보다 작으면 왼쪽 포인터를 증가합니다.
도중에 합이 0이 되거나 포인터가 엇갈린 경우에서의 배열의 두 값(result)이 0에 수렴하는 용액입니다.
Python
import sys
input = sys.stdin.readline
n = int(input())
arr = sorted(list(map(int, input().split())))
l, r = 0, n - 1
accr = sys.maxsize
result = []
while l != r:
now = arr[l] + arr[r]
p = abs(now)
if p < accr:
accr = p
result = [arr[l], arr[r]]
if now > 0:
r -= 1
elif now < 0:
l += 1
else:
break
print(*result)
TypeScript
function solution(n: number, arr: Array<number>) {
arr.sort((a, b) => a - b);
let [l, r, accr] = [0, n - 1, Number.MAX_SAFE_INTEGER];
let result;
while (l != r) {
const now = arr[l] + arr[r];
const p = Math.abs(now);
if (p < accr) {
accr = p;
result = [arr[l], arr[r]];
}
if (now > 0) r -= 1;
else if (now < 0) l += 1;
else break;
}
console.log(result);
}
solution(5, [-2, 4, -99, -1, 98]);