문제 풀이/프로그래머스

[프로그래머스] 더 맵게(JAVA)

27200 2024. 4. 26. 22:17

https://school.programmers.co.kr/learn/courses/30/lessons/42626?language=java


풀이

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(int i = 0; i < scoville.length; i++){
            pq.add(scoville[i]);
        }
        while(pq.size() >= 2){
            int first = pq.poll();
            if(first < K){
                answer++;
                int second = pq.poll();
                pq.add(first + second*2);
            }else{
                pq.add(first);
                break;
            }
        }
        if(pq.size() == 1){
            int first = pq.poll();
            if(first < K){
                return -1;
            }
        } 
        
        return answer;
    
    }
}

 

우선순위 큐로 오름차순 정렬을 한 것을 앞에서부터 뽑아 생각한다.

만약 큐 사이즈가 2이상(두개를 뽑아야 할 수 있기 때문에)라면 반복을 하면서 비교한다.

1. 처음 뽑은 값이 K보다 작다면 조건을 만족하지 못한다.

1-1. answer++을 통해 횟수가 진행 되었음을 표시하고, 두번째 값을 꺼내어 연산을 진행한 뒤에 더한다.

2. 만약 뽑은 값이 K보다 크거나 같다면 더 이상 반복할 필요가 없으므로 큐에 원래 값을 다시 넣어주고 반복을 종료하낟.

3. 최종적으로 큐 사이즈가 1이면 마지막(큐사이즈가 2인 반복)에 처리된 값을 검사하기 위해 하나만 뽑아서 검사한 뒤에 만약 K보다 작다면 -1을 반환함으로써 예외처리를 한다.