[Java] 백준 17208. 카우버거 알바생

문제 링크 - https://www.acmicpc.net/problem/17208

 

 

 


 

 

 

 

 

 

문제

중간고사 종료를 기념해 계획 없이 돈을 쓰던 영석이는 안타깝게도 통장 잔고가 100원도 남지 않게 되었고, 결국 영석이는 카우버거 주방 알바를 하기로 했다. 카우버거는 치즈버거와 감자튀김을 파는 중앙대학교의 유명한 음식점이다.

알바 첫날, 영석이가 주방에 들어선 순간 그는 매우 중요한 사실을 깨달았다. 사실 그는 치즈버거는 물론이고 감자튀김도 만들 줄 모른다는 것이다. 이때 다행히도 주방에는 누군가 만들어둔 치즈버거와 감자튀김이 몇 개 남아있었고, 영석이는 현재 들어온 주문을 이걸 이용해 처리하기로 했다.

모든 주문은 각각 치즈버거 요구 개수와 감자튀김 요구 개수를 의미하는 2개의 정수로 이루어진다. 어떤 주문을 처리하기 위해서는 치즈버거와 감자튀김을 정확히 그 주문에서 요구하는 만큼 써야 한다. 또한 주문이 들어온 순서와 관계없이 원하는 주문을 선택해 처리할 수 있으며, 한번 처리한 주문은 사라지므로 같은 주문을 다시 처리하는 것은 불가능하다.

아쉽게도 주방에 남아있는 것이 많지 않기 때문에 어떤 주문은 처리하지 못할 수도 있다. 최선의 방법으로 주문을 선택해 처리한다면 최대 몇 개의 주문을 처리할 수 있을까?

 

 

입력

첫째 줄에 주문의 수 N(1 ≤ N ≤ 100), 주방에 남은 치즈버거 개수 M(1 ≤ M ≤ 300), 주방에 남은 감자튀김 개수 K(1 ≤ K ≤ 300)가 주어진다.

둘째 줄부터 N개의 줄에는 주문 내용을 의미하는 두 정수 x, y (1 ≤ x, y ≤ 300)가 주어진다. x는 치즈버거 요구 개수, y는 감자튀김 요구 개수를 나타낸다.

 

 

출력

주방에 남은 치즈버거와 감자튀김을 사용해 처리할 수 있는 최대 주문 개수를 출력한다.

 

 

 

 

 

 


 

풀이

배낭문제로 풀었다. 현재 있는 치즈 버거 개수와 감자튀김 개수로 2차원 dp 배열을 만들어서 현재 있는 재료들로 처리할 수 있는 최대 주문 개수를 찾아낸다. 

주문 수만큼 for문을 돌면서 현재 주문을 처리했을 때의 총 주문 개수와 주문을 처리하지 않았을 때의 총 주문 개수를 비교해서 최댓값을 갱신한다. 마지막으로 최댓값으로 갱신된 dp[C][P]를 return하면 된다.

 

 

 


 

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// https://www.acmicpc.net/problem/17208
public class Main {
    private static int N, M, K;
    private static int[] cheese; // 치즈버거 요구 개수
    private static int[] potato; // 감자튀김 요구 개수


    public static void main(String[] args) throws IOException {
        init();

        int cnt = getCnt();
        System.out.print(cnt);
    }//main


    private static int getCnt() {
        int[][] dp = new int[M+1][K+1];

        for(int i=0; i<N; i++) { // 주문
            int c = cheese[i]; // 치즈버거 개수
            int p = potato[i]; // 감자튀김 개수
            for(int m=M; m>=c; m--) {
                for(int k=K; k>=p; k--) {
                    dp[m][k] = Math.max(dp[m][k], dp[m-c][k-p] + 1);
                }
            }
        }

        return dp[M][K];
    }//getCnt


    private static void init() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken()); // 주문의 수
        M = Integer.parseInt(st.nextToken()); // 치즈버거 개수
        K = Integer.parseInt(st.nextToken()); // 감자튀김 개수

        cheese = new int[N]; // 치즈버거 요구 개수
        potato = new int[N]; // 감자튀김 요구 개수

        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            cheese[i] = Integer.parseInt(st.nextToken());
            potato[i] = Integer.parseInt(st.nextToken());
        }

        br.close();
    }//init


}//class