https://www.acmicpc.net/problem/2470
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let n = Number(input[0]);
let arr = new Array(n);
arr = input[1].split(" ").map(Number);
arr.sort((a, b) => a - b);
let left = 0;
let right = n - 1;
let sum = 0;
let ans = Infinity;
let ans_pair = new Array(2).fill(0);
while (left !== right) {
sum = arr[left] + arr[right];
if (Math.abs(sum) < ans) {
ans = Math.abs(sum);
ans_pair[0] = arr[left];
ans_pair[1] = arr[right];
}
if (sum === 0) {
break;
} else if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
}
}
console.log(ans_pair.join(" "));
✔ 알고리즘 : 투포인터
✔ 용액의 값이 주어졌을 때 두개의 용액을 섞어서 0에 제일 가까운용액을 만들어야 하는 문제이다.
✔ 용액을 오름차순 정렬한다
✔ left는 index 0, right는 index n-1로 설정하고 투포인터 탐색을 시작한다.
✔ left와 right가 같아지는 순간 두가지 용액이 되지 않으므로 while문에서 빠져나온다.
✔ 두개의 용액합을 구하여 절댓값을 적용해 ans와 비교한다
✔ sum이 0이면 break , sum이 양수면 수를 줄여야하므로 right포인터를 1 감소, sum이 음수면 수를 증가시켜야하므로 left포인터를 1 증가 시킨다.
✔ 난이도 : 백준 기준 골드 5