[백준 2805번] 나무 자르기(Node.js,JavaScript)

박동현·2022년 5월 22일
0

백준문제풀이

목록 보기
6/11
post-thumbnail

출처

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

문제풀이

const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
var [N, H] = input.shift().split(" ").map(Number);
var Trees = input.shift().split(" ").map(Number);
var MaxH = Math.max(...Trees);

function binarySearch(H, Trees, min, max) {
  let mid = 0;
  let BestH = 0;
  
  while (min <= max) {
    let SumWood = 0;
    mid = Math.floor((min + max) / 2);
    Trees.forEach((a) => {
      let rest = a - mid;
      if (rest > 0) SumWood += rest;
    });
    if (SumWood >= H) {
      if (mid > BestH) BestH = mid;
      min = mid + 1;
    } 
    else {
      max = mid - 1;
    }
  }
  return BestH;
}

const answer = binarySearch(H, Trees, 0, MaxH);
console.log(answer);

환경에 관심이 많은 상근이를 위해 가장 효율적으로 나무를 자르는 높이를 구하는 문제.

1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000

주어지는 입력값이 매우 큰 수이기때문에 모든 수를 순회하면서 풀면 시간초과가 난다.
이분탐색을 이용하여 문제를 해결해 보았다.

자르는 높이는 주어진 나무들 중 가장 큰 나무보다 클 수 없기 때문에 범위를 0 - Math.max(...Trees)로 잡았다.

그 후 초기 중앙값을 잡고 중앙값보다 큰 나무
나무 - 중앙값 = 양수를 합산해 주었다.
합산한 나무의 값이 필요한나무보다 많거나 같고, 현재 최적의 높이보다 중앙값이 더 크다면 그 값이 최적의 높이이다. 그 후 찾고자하는 값은 중앙값의 오른쪽에 위치하므로 최소값을 재조정해준다.
합산한 나무의 값이 필요한나무보다 적으면, 찾고자하는값은 중앙값의 왼쪽에 위치하므로 최대값을 재조정해준다.

이분탐색을 이해한다면 풀수있는 문제였다.

profile
좋은 개발자가 되고싶은 전공자

0개의 댓글

관련 채용 정보