[boj] 2473. 세 용액 (node.js)

호이·2022년 3월 2일
0

algorithm

목록 보기
32/77
post-thumbnail

문제 요약

[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();
});
profile
매일 부활하는 개복치

0개의 댓글