알고리즘

[Lv_3] 코딩 테스트 공부

빅디 2023. 11. 30. 01:06
728x90
import java.util.*;

class Solution {
    public int solution(int alp, int cop, int[][] problems) {
        int answer = 0;
        int al_max = Arrays.stream(problems)
            .map(problem -> problem[0])
            .max(Comparator.naturalOrder()).orElseThrow();
        int co_max = Arrays.stream(problems)
            .map(problem -> problem[1])
            .max(Comparator.naturalOrder()).orElseThrow();
        
        // 이미 모든 문제를 풀 수 있는 경우 0 반환
        if (alp >= al_max && cop >= co_max) {
            return 0;
        }
        
        // 능력이 요구최대값을 초과한 경우 요구최대값으로 변경
        if (alp >= al_max) {
            alp = al_max;
        }
        
        if (cop >= co_max) {
            cop = co_max;
        }
        
        int[][] dp = new int[al_max + 1][co_max + 1];
        for (int i = alp; i < al_max + 1; i++) {
            for (int j = cop; j < co_max + 1; j++) {
                dp[i][j] = Integer.MAX_VALUE;
            }
        }
        
        // 기존 문제 + 기초 문제
        int[][] new_ps = Arrays.copyOf(problems, problems.length + 2);
        new_ps[problems.length] = new int[] { 0,0,0,1,1 };
        new_ps[problems.length + 1] = new int[] { 0,0,1,0,1 };
        
        // 초기화
        dp[alp][cop] = 0;
        
        for (int i = alp; i <= al_max; i++) {
            for (int j = cop; j <= co_max; j++) {	
                for (int[] problem : new_ps) {
                    if (i >= problem[0] && j >= problem[1]) {
                        if (i + problem[2] > al_max && j + problem[3] > co_max) {
                            dp[al_max][co_max] = Math.min(dp[al_max][co_max], dp[i][j] + problem[4]);
                        } else if (i + problem[2] > al_max) {
                            dp[al_max][j + problem[3]] = Math.min(dp[al_max][j + problem[3]], dp[i][j] + problem[4]);
                        } else if (j + problem[3] > co_max) {
                            dp[i + problem[2]][co_max] = Math.min(dp[i + problem[2]][co_max], dp[i][j] + problem[4]);
                        } else if (i + problem[2] <= al_max && j + problem[3] <= co_max) {
                            dp[i + problem[2]][j + problem[3]] = Math.min(dp[i + problem[2]][j + problem[3]], dp[i][j] + problem[4]);
                        }
                    }
                }
            }
        }
        
        return dp[al_max][co_max];
    }
}

 

✔️ 링크 : 코딩테스트 연습 - 코딩 테스트 공부 | 프로그래머스 스쿨 (programmers.co.kr)