백준 - 짐 챙기는 숌(1817번)

nyun-nye·2025년 2월 5일

백준 스터디

목록 보기
7/15

백준 - 짐 챙기는 숌(1817번)

문제

  • 숌은 짐을 챙겨서 겨울캠프에서 집으로 가려고 한다. 근데 숌은 공부를 많이 하러 캠프에 온 것이기 때문에 책을 엄청나게 많이 가지고 왔다. 숌은 이 책을 방에 탑처럼 쌓아 놨다.
  • 숌은 책을 박스에 차곡차곡 넣어서 택배로 미리 보내려고 한다. 책은 탑처럼 차곡차곡 쌓여있기 때문에, 차례대로 박스에 넣을 수밖에 없다.
  • 각각의 책은 무게가 있다. 그리고 박스는 최대 넣을수 있는 무게가 있다. 숌이 필요한 박스의 개수의 최솟값을 구하는 프로그램을 작성하시오.

입력

  • 첫째 줄에 책의 개수 N과 박스에 넣을 수 있는 최대 무게 M이 주어진다. N은 0보다 크거나 같고 50보다 작거나 같은 정수이고, M은 1,000보다 작거나 같은 자연수이다.
  • N이 0보다 큰 경우 둘째 줄에 책의 무게가 공백을 사이에 두고 주어진다. 책의 무게는 M보다 작거나 같은 자연수이다.

출력

  • 첫째 줄에 필요한 박스의 개수의 최솟값을 출력한다.

이 문제는 다음에 올 책의 무게를 고려하는 것이 포인트이다.


코드 설계

문제 해결의 단계는 아래와 같다.

  1. 책의 갯수를 N으로, 최대 무게를 M으로 받는다.
  2. 각 책의 무게를 배열 books로 받는다.
  3. 박스의 갯수를 counter로 하여 초기값을 1로 준다.
  4. sumnextSum으로 현재 박스의 총 책의 무게의 합과 다음 책의 무게의 합을 계산한다.
  5. N만큼 루프를 돌며 현재 책의 무게가 최대무게인 M이랑 같아지면 counter를 증가하고, sumnextSum의 값을 초기화한다.
  6. 다음 책의 무게를 미리 재서 최대무게인 M을 초과하면 counter를 미리 증가하고, nextSumsum의 값을 초기화한다.
  7. 이때 책의 갯수인 N값이 0개이면 0을 출력한다.

제출한 답

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim()
  .split("\n")
  .map((el) => el.split(" ").map(Number));

  
const N = input[0][0]; // 책의 갯수
const M = input[0][1]; // 최대 무게 M

const books = input[1];

let counter = 1;
let sum = 0;
let nextSum = 0;

for(let i=0; i<N; i++){
    if(sum === M){
        counter++;
        sum = 0;
        nextSum = 0;
    }
    sum += books[i];
    nextSum = sum + books[i+1];
    if(nextSum > M){
        counter++;
        nextSum = 0;
        sum = 0;
    }
}
if(N === 0)
    counter = 0;

console.log(counter);

💡한줄평

사실 이 문제는 한 번에 풀었다. 미리 설계를 하지 않고 예제를 하나씩 넣어가면서 때려맞추기를 했다. 그래서 그런지 코드가 깔끔하지 않고 개연성이 없는 것 같다. 시간관계상 우선 이렇게 풀고 넘어간다. 더 좋은 풀이를 고민하고 추가할 계획이다. 다음부터는 좀 여유를 가지고 문제를 풀이해야겠다.

profile
시야가 넓은 개발자가 되기를 희망합니다.

0개의 댓글