[노드JS/알고리즘] 백준 - 11256번 사탕

[문제]

당신은 사탕 공장의 주인이다. 날마다, 당신은 J개의 사탕을 가게에 보내기 위해 상자에 포장해야 한다.

당신은 크기가 다른 상자 N개를 가지고 있다. 당신은 편리를 위해 상자를 최소한으로 쓰려고 한다. (박스를 다 채울 필요는 없다. 일부분만 채워도 된다.)

당신이 공장에서 나오는 사탕의 개수와 각 상자의 크기를 입력받고, 상자를 최소한으로 쓸 때의 사용되는 상자 개수를 출력하는 프로그램을 작성하라. 사탕들을 포장할 공간은 충분하다는 것이 보장된다.

 

첫 번째 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각각의 테스트 케이스는 아래 형식을 따른다.

테스트 케이스의 첫 번째 줄에는 사탕의 개수 J상자의 개수 N이 주어진다. (1 ≤ J, N ≤ 1,000)

다음 N개의 줄에는 각각 줄마다 i번째 상자의 세로 길이 Ri 그리고 가로 길이 Ci가 주어진다. 상자의 크기는 다른 상자의 크기와 똑같을 수도 있다. 상자에는 Ri * Ci보다 더 많은 사탕을 포장할 수 없다. (1 ≤ Ri, Ci ≤ 10,000)

 

[코드]

// 3
const createBox = (J, N) => {
  let boxes = [];
  for (let i = 0; i < N; i++) {
    boxes.push(
      input()
        .split(" ")
        .map((v) => +v)
        .reduce((acc, cur) => acc * cur, 1)
    );
  }
  boxes = boxes.sort((a, b) => b - a);

  for (let j = 0; j < boxes.length; j++) {
    if (J <= 0) {
      console.log(j);
      break;
    }
    J -= boxes[j];
  }
};

// 1
const stdin = require("fs").readFileSync("/dev/stdin").toString().split("\n");

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

// 2
const T = +input();
for (let i = 0; i < T; i++) {
  let [J, N] = input()
    .split(" ")
    .map((v) => +v);

  createBox(J, N);
}

1. 즉시 실행 함수를 생성하여 호출될 때마다 line이 늘어나며 입력 값이 추가된다.

2. 문제에서 주어진 T, J, N을 받는다. 그리고, 최소한의 상자 개수를 구하는 함수 createBox의 인자로 J, N을 넘겨준다.

3. boxes 배열에 N만큼 순회하며 입력 값(예시에서 R과 C)을 곱하고 push 한다. 

 

boxes를 출력하면 다음과 같다. (예제 입력 1을 넣었을 때)

boxes를 내림차순으로 정렬하고,

boxes에 담긴 값을 순회하며 사탕의 개수 J에서 box의 값을 빼준다! 단, J가 0 이하면 답을 출력해야 한다.

 

[새로 알게 된 사실]

항상 입력 값을 불러올 때, 배열에 담고 코드를 짰다.

// 이렇게!!
let [n, ...arr] = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .split("\n")
  .map((v) => +v);

하지만, 이 문제는 테스트 케이스(T)가 추가로 있어서 입력 값을 배열에 담고, 정제하기가 까다로웠다.

열심히 구글링 한 결과, 한줄기 빛 같은 글을 찾았고 코드를 수정하여 마침내 해결하였다.

(밑에 링크 걸어두었습니다.)

 

[참고] 백준에서 노드js 입력을 쉽게 받는 방법

 

[BOJ] 백준에서 Node.js 입력을 Python처럼 쉽게 받는 법

요즘 들어 알고리즘 문제를 자바스크립트로 한두 문제씩 풀고 있습니다. BOJ를 자바스크립트로 시도해보셨다면 아시겠지만, 들어오는 입력을 모두 한 배열에 때려 박고 각각 인덱스로 접근해 사

degurii.tistory.com

 

그리고, 코드에 작성하진 않았지만, 참고 글에 있는 Windows 로컬에서 예제 테스트하기도 정말 꼭 따라해야 한다!

가끔 readFileSync("input.txt")라고 적어두고 제출해서 런타임 에러가 발생한 게 한두 번이 아니기 때문이다...ㅎㅎ

 

320x100