알고리즘

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

박카스마시며코딩 2022. 9. 5. 14:11

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

 

프로그래머스

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

programmers.co.kr

 

저는 우선순위 큐를 이용해 문제를 해결하였습니다.

먼저 problems에서 가장 큰 알고력과 코딩력을 찾습니다.

우선순위 큐를 통해 cost가 가장 낮은 것이 먼저 오도록 하였습니다.

3가지 경우로 진행하였습니다. 알고력과 cost를 1씩 올리거나, 코딩력과 cost를 1씩 올리거나, problems를 돌면서 알고력과 코딩력 둘 다 problem보다 높다면 이를 푸는 경우로 진행하였습니다.

방문 체크는 Set<String>으로 하여 해결하였습니다.

 

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;
    
    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[alp_req_index]);
            maxCop = Math.max(maxCop,problem[cop_req_index]);
        }
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->o1[2]-o2[2]);
        pq.offer(new int[] {alp,cop,0});
        Set<String> visited = new HashSet<>();
        while(!pq.isEmpty()){
            int[] now = pq.poll();
            if(now[0] >= maxAlp && now[1] >= maxCop){
                answer = now[2];
                break;
            }
            int[] next = new int[] {now[0]+1, now[1], now[2]+1};
            if(!visited.contains(Arrays.toString(next))){
                visited.add(Arrays.toString(next));
                pq.offer(next);
            }
            next = new int[] {now[0], now[1]+1, now[2]+1};
            if(!visited.contains(Arrays.toString(next))){
                visited.add(Arrays.toString(next));
                pq.offer(next);
            }
            for(int[] problem : problems){
                if(now[0] >= problem[alp_req_index] && now[1] >= problem[cop_req_index]){
                    next = new int[] {now[0] + problem[alp_rwd_index],now[1] + problem[cop_rwd_index],
                                     now[2]+problem[cost_index]};
                    if(!visited.contains(Arrays.toString(next))){
                        visited.add(Arrays.toString(next));
                        pq.offer(next);
                    }
                }
            }
        }
        return answer;
    }
}