
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
const [[n], liquid] = fs
.readFileSync(path)
.toString()
.trim()
.split('\n')
.map((it) => it.split(' ').map(Number));
let left = 0;
let right = n - 1;
let minAbs = Infinity;
const ans = [0, 0];
while (left < right) {
const abs = Math.abs(liquid[left] + liquid[right]);
if (abs < minAbs) {
minAbs = abs;
ans[0] = liquid[left];
ans[1] = liquid[right];
}
if (liquid[left] + liquid[right] > 0) right -= 1;
else left += 1;
}
console.log(...ans);
⏰ 소요한 시간 : -
투포인터 문제로 풀이했다.
완전 탐색으로 두 용액의 합을 모두 구하면 시간이 너무 오래걸리기 때문에, 투포인터를 사용해 유효한 경우의 수만 구해줬다.
left와 right 각 포인터를 0번 인덱스, n-1번 인덱스로 잡고 특성값의 합이 0보다 크냐, 작냐에 따라 포인터를 가운데로 모아주는 형식으로 구현했다.
그리고 포인터가 옮겨질 때 마다 특성값이 0에 가까운지 비교해주는 로직을 넣어놨다.