[BOJ] 2805 나무자르기 Node.js 런타임에러(StackSizeExceeded) 해결

Urther·2021년 10월 19일
0

알고리즘

목록 보기
16/41
post-thumbnail

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"로 해두고 변경해주지 않아서 생긴 문제였다.

넘기고,

👴🏻 StackSizeExceed 문제 발생은 뭐지

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 는 프로그래머스인가 . . . . .ㅠㅠ

profile
이전해요 ☘️ https://mei-zy.tistory.com

0개의 댓글