알고리즘

프로그래머스 코딩 테스트 공부(JAVA)

박카스마시며코딩 2023. 8. 5. 20:14

https://school.programmers.co.kr/learn/courses/30/lessons/118668

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

우선순위 큐를 통해 문제를 해결하였습니다.

우선운위 큐를 통해 최소 시간을 찾고 해당 코딩력과 문제력으로 모든 문제를 풀 수 있는지를 판단하고 풀 수 있다면 그 시간을 결과로 리턴하여 문제를 해결하였습니다.

 

import java.util.*;

class Solution {
    
    private static final int alp_req_INDEX = 0;
    private static final int cop_req_INDEX = 1;
    private static final int alp_rwd_INDEX = 2;
    private static final int cop_rwd_INDEX = 3;
    private static final int cost_INDEX = 4;
    private static final int NOT_FOUND = -1;
    
    public int solution(int alp, int cop, int[][] problems) {
        int answer = 0;
        int maxAlp = 0;
        int maxCop = 0;
        for(int[] problem : problems){
            maxAlp = Math.max(maxAlp,problem[0]);
            maxCop = Math.max(maxCop,problem[1]);
        }
        PriorityQueue<int[]> pq = new PriorityQueue<>((v1,v2)->{
            return v1[2] - v2[2];
        });
        Map<String,Integer> map = new HashMap<>();
        pq.offer(new int[]{alp,cop,0});
        while(!pq.isEmpty()){
            int[] now = pq.poll();
            if(now[0] >= maxAlp && now[1] >= maxCop){
                return now[2];
            }
            if(now[0] < maxAlp){
                int[] next = new int[]{now[0]+1,now[1],now[2]+1};
                if(!map.containsKey(changeArrayToString(next)) || map.get(changeArrayToString(next)) > now[2]+1){
                    pq.offer(next);
                    map.put(changeArrayToString(next),now[2]+1);
                }
            }
            if(now[1] < maxCop){
                int[] next = new int[]{now[0],now[1]+1,now[2]+1};
                if(!map.containsKey(changeArrayToString(next)) || map.get(changeArrayToString(next)) > now[2]+1){
                    pq.offer(next);
                    map.put(changeArrayToString(next),now[2]+1);
                }
            }
            for(int[] problem : problems){
                if(now[0] < problem[alp_req_INDEX] || now[1] < problem[cop_req_INDEX]){
                    continue;
                }
                int[] next = new int[]{now[0] + problem[alp_rwd_INDEX],now[1] +problem[cop_rwd_INDEX],now[2] + problem[cost_INDEX]};
                if(!map.containsKey(changeArrayToString(next)) || map.get(changeArrayToString(next)) > now[2]+problem[cost_INDEX]){
                    pq.offer(next);
                    map.put(changeArrayToString(next),now[2]+problem[cost_INDEX]);
                }
            }
        }
        return NOT_FOUND;
    }
    private static String changeArrayToString(int[] arr){
        return "{" + arr[0] + "," + arr[1] + "}";
    }
}