문제 요약
[boj] 2473. 세 용액 (node.js)
- 세 용액의 합이 0 에 가장 가깝게 하는 세 용액을 출력
풀이
- for 문을 통해 두 용액 i(0 ~ N-1), j(i+1 ~ N-1)을 지정한 후 이 두 용액을 보완해주는 나머지 한 용액 값을 특정했다.
- 두 포인터 알고리즘을 활용해서 문제를 풀이했다.
내 풀이
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const solution = () => {
const N = input();
const arr = input().split(" ").map(Number);
let result;
arr.sort((a, b) => a - b);
let minSum = 10000000000;
for (let i = 0; i < N - 1; i++) {
for (let j = i + 1; j < N; j++) {
sum = arr[i] + arr[j];
let idx = binSearch(arr, 0, N - 1, -sum);
if (idx == i || idx == j) continue;
if (Math.abs(sum + arr[idx]) < minSum) {
minSum = Math.abs(sum + arr[idx]);
result = [arr[i], arr[j], arr[idx]];
}
if (idx - 1 == i || idx - 1 == j) continue;
if (Math.abs(sum + arr[idx - 1]) < minSum) {
minSum = Math.abs(sum + arr[idx - 1]);
result = [arr[i], arr[j], arr[idx - 1]];
}
}
}
console.log(result.sort((a, b) => a - b).join(" "));
process.exit();
};
const binSearch = (arr, L, R, X) => {
let result = R;
while (L <= R) {
let mid = Math.floor((L + R) / 2);
if (arr[mid] < X) {
L = mid + 1;
} else {
result = mid;
R = mid - 1;
}
}
return result;
};
let cnt = 0;
const input = () => stdin[cnt++];
let stdin = [];
rl.on("line", function (line) {
stdin.push(line);
}).on("close", function () {
solution();
});