https://www.acmicpc.net/problem/2473
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = +input[0];
const nums = input[1]
.split(" ")
.map(Number)
.sort((a, b) => a - b);
const ansArr = Array.from({ length: 3 }, () => 0);
let ans = Infinity;
for (let i = 0; i < N - 2; i++) {
let left = i + 1;
let right = N - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (Math.abs(sum) < ans) {
ans = Math.abs(sum);
ansArr[0] = nums[i];
ansArr[1] = nums[left];
ansArr[2] = nums[right];
}
if (sum < 0) left++;
else right--;
}
}
console.log(ansArr.join(" "));
✔ 알고리즘 : 투포인터
✔ 두 용액에 이은 투포인터 문제이다. 용액 3개를 골라야 하므로 1개(index : i)는 고정시키고 i+1 ~ N-1 까지 구간에서 투포인터 알고리즘으로 순회하였다.
✔ 오름차순 정렬이므로 합이 0보다 작으면 left포인터 1증가(전체 값 증가)해주고 0보다 크면 right포인터를 1감소(전체 값 감소)해주었다.
✔ 난이도 : 백준 기준 골드 4