본문 바로가기
Algorithm/백준풀이

[알고리즘 문제풀이] 백준 7579 앱(JAVA코드)

by 계범 2022. 4. 2.

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

 

7579번: 앱

입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활

www.acmicpc.net

import java.util.*;
import java.io.*;

/**
 * 1. 앱 메모리와 비용(n개)과 구해야할 메모리(m)가 주어짐.
 * 
 * 2. dp[앱][최소비용] = 최대메모리
 * 
 * 3. 2중 포문으로 돌면서 m이상 중 최소비용 저장해두기
 * 
 */

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[] memory = new int[n];
        int[] cost = new int[n];

        int result = 10_000;

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

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

        int[][] dp = new int[n][10_001];
        

        for(int i = 0; i < n; i++){
            int curM = memory[i];
            int curC = cost[i];
            
            for(int j = 0; j <= 10_000; j++){
                if(i == 0){ // 첫번째 앱일때 비용체크
                    if(j >= curC){
                        dp[i][j] = curM;
                    }
                }else{
                    dp[i][j] = dp[i-1][j];
                    
                    if(j >= curC){
                        dp[i][j] = Math.max(dp[i][j],dp[i-1][j-curC]+curM);
                    }
                }

                if(dp[i][j] >= m){
                    result = Math.min(j,result);
                }
            }
        }

        System.out.println(result);
    }
}

댓글