Algorithm, Problem Solving/백준(boj)

[백준][Java] 14728 - 벼락치기

태오님 2023. 4. 1.

목차

     

    문제 정보

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

     

    14728번: 벼락치기

    ChAOS(Chung-ang Algorithm Organization and Study) 회장이 되어 일이 많아진 준석이는 시험기간에도 일 때문에 공부를 하지 못하다가 시험 전 날이 되어버리고 말았다. 다행히도 친절하신 교수님께서 아래와

    www.acmicpc.net

    난이도 : Gold 5

    유형 : 0/1 냅색(DP), 브루트포스

    시간 : O(N * T)

     

     

    (냅색문제에 잘 모른다면 이 분의 글을 읽는 것을 추천한다. 설명이 아주 기깔나고 잘하셨다.)

    https://gsmesie692.tistory.com/113

     

    Dynamic Programming: 배낭 채우기 문제 (Knapsack Problem)

    도둑이 보석가게에 배낭을 메고 침입했다. 배낭의 최대 용량은 W이며, 이를 초과해서 보석을 담으면 배낭이 찢어질 것이다. 각 보석들의 무게와 가격은 알고 있다. 배낭이 찢어지지 않는 선에서

    gsmesie692.tistory.com

    출처 : https://gsmesie692.tistory.com/


    문제 풀이

    아주 스탠다드한 0/1 냅색 문제이다.

    변수 2개를 이용한 2차원 dp테이블 만들어 활용하면 된다.

     

    1. 단원의 갯수 - row

    2. 총 시간 - column

     

    점화식)

    k 는 1 ~ T까지의 수 (세로열)

    j < k 일 때
    dp[i][j] = dp[i-1][j]
    
    j >= k 일 때
    dp[i][j] = Math.max(dp[i-1][j-k] + S, dp[i-1][j])

    코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    public class Main {
    
        private int N, T;
        private int K, S;
        private int[][] dp;
    
        public void solution() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            T = Integer.parseInt(st.nextToken());
    
            dp = new int[N + 1][T + 1];
            for (int i = 1; i <= N; i++) {
                st = new StringTokenizer(br.readLine());
                K = Integer.parseInt(st.nextToken());
                S = Integer.parseInt(st.nextToken());
    
                for (int j = 1; j <= T; j++) {
                    if (j < K) {
                        dp[i][j] = dp[i - 1][j];
                    } else {
                        dp[i][j] = Math.max(dp[i - 1][j - K] + S, dp[i - 1][j]);
                    }
                }
            }
    
            System.out.println(dp[N][T]);
        }
    
        public static void main(String[] args) throws IOException {
            new Main().solution();
        }
    }

    댓글