[백준] 2470 두 용액 - javascript

Yongwoo Cho·2021년 11월 5일
0

알고리즘

목록 보기
42/104
post-custom-banner

📌 문제

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

profile
Frontend 개발자입니다 😎
post-custom-banner

0개의 댓글