알고리즘/구현

[BOJ] 백준 1817 - 짐 챙기는 숌 풀이

송승현(SSH) 2022. 11. 26. 16:33

1. 문제

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

 

1817번: 짐 챙기는 숌

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

www.acmicpc.net

 

2. 풀이

백준 실버 5의 난이도인 문제이며, 배낭 문제와 유사하지만 배낭 문제보다 쉽게 접근할 수 있다.

입력으로 주어지는 N이 0이 아니라면 로직을 수행하고 0이라면 0을 출력한다. (17 ~ 18줄)
책의 무게를 리스트로 받은 후 하나씩 배낭에 넣어보면서 조건문을 수행하면 된다.

1. 탐색한 책의 무게가 M보다 클 경우 
- 이 경우 하나의 박스에 담을 수 없으므로 continue를 통해 반복문의 처음으로 돌아간다.

2. 현재 가방에 들어있는 무게(weight)에 탐색한 책의 무게를 더한 값이 M보다 작거나 같을 경우
- 이 경우 하나의 가방에 넣을 수 있으므로 탐색한 책의 무게를 weight에 더한다.

3. 현재 가방에 들어있는 무게(weight)에 탐색한 책의 무게를 더한 값이 M보다 클 경우
- 이 경우 새 가방을 추가해야하므로 가방의 개수(cnt)를 하나 더해준 후 현재 가방의 무게를 탐색한 책의 무게로 바꾼다.

마지막으로 cnt에 +1을 해준 값을 출력해주면 정답!!!
* cnt에 +1을 해주는 이유는 처음에 가방 값을 추가해주지 않고 반복문을 시작하기 때문

 

3. 소스 코드

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        List<Integer> list = new ArrayList<>();
        if (N == 0) {
            bw.write("0");
        } else {
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) {
                list.add(Integer.parseInt(st.nextToken()));
            }

            int cnt = 0;
            int weight = 0;
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i) > M) {
                    continue;
                }

                if (weight + list.get(i) <= M) {
                    weight += list.get(i);
                } else {
                    cnt += 1;
                    weight = list.get(i);
                }
            }
            bw.write(Integer.toString(cnt + 1));
        }

        bw.flush();
        bw.close();
        br.close();
    }
}