Jaeilit

백준 1654 랜선자르기 js 본문

알고리즘

백준 1654 랜선자르기 js

Jaeilit 2022. 10. 4. 17:26
728x90

문제 링크

https://www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

 

정답코드

const fs = require("fs");

const filePath =
  process.platform === "linux" ? "/dev/stdin" : "./이분탐색/1654/input.txt";

const input = fs.readFileSync(filePath).toString().trim().split("\n");

const [n, k] = input
  .shift()
  .split(" ")
  .map((a) => +a);

const lines = input.map((a) => +a).sort((a, b) => a - b);

let max = Math.max(...lines);
let min = 1;

while (min <= max) {
  let mid = Math.floor((min + max) / 2);

  let line = lines
    .map((line) => Math.floor(line / mid))
    .reduce((acc, cur) => (acc += cur), 0);

  if (line >= k) {
    min = mid + 1;
  } else {
    max = mid - 1;
  }
}

console.log(max);

로직설명

  • 가장 큰 값과 작은 값을 더하고 평균으로 mid 를 낸다. 
    • max 801 min 1 = 802 / 2 = mid =>401
  • 배열의 값들을 평균 값으로 나눠서 모두 합하여 본다.
    • mid 가 401 일시 합산 값 == 5
  • 합한 값이 5인데 목표 값 11이 되지 않았으니 max에 mid 401 -1 인 400 할당하고 다시 나누기 2를 한다.

이런식으로 값을 찾아낸다.

 

처음에 테케를 봤을 때 802 / 4 하면 200인데 이런식으로 하는게 맞나.. 아니면 나무자르기 처럼 값을 다 평균내야하나 생각하면서 이게 왜 이분탐색인지 모르겠었는데 딱 원하는 그 값을 찾는 이분탐색보다 좀 더 심화적으로 찾은 그 값에 근접한 값을 다시 탐색을 하는 이분탐색인거같다.

728x90

'알고리즘' 카테고리의 다른 글

백준 공유기 설치 2110 js  (1) 2022.10.04
백준 10815 숫자카드 js  (0) 2022.10.04
백준 10816 Js 숫자카드2  (1) 2022.10.04
백준 2805 나무 자르기  (0) 2022.10.02
백준 1920 이진탐색  (0) 2022.10.01