BOJ_7579_앱_java

2023. 2. 9. 16:00Algorithm/BOJ

728x90

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

 

7579번: 앱

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

www.acmicpc.net

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

/**
 백준 7579번 앱
 골드 3
 */
public class BOJ_7579_앱 {
    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 A[] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); // 사용 메모리
        int c[] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); // 비활성화 비용

        int costSum = Arrays.stream(c).sum(); // cost 최대값

        App[] apps = new App[N+1];
        apps[0] = new App(0, -1, 0);
        for (int i = 1; i<=N; i++){
            apps[i] = new App(i, A[i-1], c[i-1]);
        }
        System.out.println(solution(N, M, apps, costSum));
    }

    public static int solution(int N, int M, App[] apps, int costSum){
        Arrays.sort(apps); // cost 오름차순 정렬
        int[][] dp = new int[N+1][costSum+1];
        int minCost = Integer.MAX_VALUE;
        for (int i = 1; i<N+1; i++){
           for (int j = 0; j<costSum+1; j++){
               if (j >= apps[i].cost) {
                   dp[i][j] = Math.max(dp[i-1][j-apps[i].cost] + apps[i].memory, dp[i-1][j]); // 해당 cost에서 가능한 최대 메모리 저장
               }else{
                   dp[i][j] = dp[i-1][j];
               }

               if (dp[i][j] >= M){ // M이상의 메모리를 차지하는 경우 최소값 찾기
                   minCost = Math.min(minCost, j);
               }
           }
        }

        return minCost;
    }

    public static class App implements Comparable<App>{
        int idx;
        int memory;
        int cost;
        public App(int idx, int memory, int cost){
            this.idx = idx;
            this.memory = memory;
            this.cost = cost;
        }

        @Override
        public int compareTo(App o) {
            return this.memory - o.memory;
        }

        @Override
        public String toString() {
            return "App{" +
                    "idx=" + idx +
                    ", memory=" + memory +
                    ", cost=" + cost +
                    '}';
        }
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

BOJ_9466_텀 프로젝트_java  (0) 2023.02.13
BOJ_2342_Dance Dance Revolution_java  (0) 2023.02.10
BOJ_4386_별자리 만들기_java  (0) 2023.02.08
BOJ_2473_세 용액_java  (0) 2023.02.07
BOJ_2623_음악프로그램_java  (0) 2023.02.05