Problem | 2805 나무자르기
Java로 같은 문제를 풀었었는데 또 안하면 까먹는지라 이분탐색을 까먹어버린김에 js로 다시 풀었다.
let fs = require("fs");
// let input = fs.readFileSync("/dev/stdin").toString().split("\n");
let input = fs.readFileSync("./input.txt").toString().split("\n");
split2 = input[0].split(" ");
let M = parseInt(split2[1]);
tree = input[1].split(" ");
// M : 집에 가지고 가야하는 나무의 길이
// tree : 가지고 있는 나무의 배열
// <-------풀이 시작----------->
let max = Math.max(...tree);
let left = 0,
right = max;
function cut(H) {
let cutsum = 0;
for (let x of tree) {
if (x > H) cutsum += x - H;
}
return cutsum;
}
let answer;
while (left < right) {
let mid = parseInt((left + right) / 2);
if (cut(mid) < M) right = mid - 1;
else {
answer = mid;
left = mid + 1;
}
}
console.log(answer);
처음 발생한 (ENOENT) 문제는
let input = fs.readFileSync("./input.txt").toString().split("\n");
파일 경로를 /dev/stdin
이 아닌 VSCODE에서 테스트해보기 위해 ./input.txt"
로 해두고 변경해주지 않아서 생긴 문제였다.
넘기고,
function cut(H) {
let cutsum = 0;
for (let x of tree) {
if (x > H) cutsum += x - H;
}
return cutsum;
}
함수를 많이 호출하면 발생할 수 있는 문제라기에, cut 함수 (여기서 가져갈 수 있는 나무의 길이를 계산했다)를 따로 호출하지 않고, left, right 왔다갔다하는 while문에서 계산하게끔 해보았다.
수정해본 아래 코드
while (left <= right) { let mid = parseInt((left + right) / 2); let cutsum=0; for (let x of tree) { if (x > mid) cutsum += x - mid; } if (cutsum < M) right = mid - 1; else { answer = mid; left = mid + 1; } }
결론은 실패다.
함수 문제가 아닌, let max = Math.max(...tree);
문제
그래서 찾아봤더니 최대 인자를 넘기면 에러가 뜬다고 한다.
그래서 max값을 그냥 2000000000으로 상수값으로 설정하니까 잘 돌아갔다 ! !
역시 js 는 프로그래머스인가 . . . . .ㅠㅠ