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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


 

문제 설명

매운 것을 못 먹는 Leo는 모든 음식의 스코빌 지수를 K이상으로 만들고 싶어 합니다.

  • 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해, 가장 지수가 낮은 두 음식을 다음과 같이 섞습니다.
  • 섞은 음식의 스코빌 지수 = 가장 낮음 + (두 번째 낮음 * 2)
  • 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞은 최소 횟수를 구하는 문제입니다.

문제 해결을 위한 과정

이 문제의 핵심은 "데이터를 추가하거나 삭제할 때마다 항상 정렬된 상태(가장 작은 값)를 유지하는 것"입니다. 이를 위해 최소 힙(Min Heap) 구조인 PriorityQueue를 사용했습니다.


소스코드
import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        int answer = 0;
        
        for(int i = 0; i < scoville.length; i++) {
            pq.offer(scoville[i]);
        }
        
        while(!pq.isEmpty()) {
            if(pq.size() >= 2) {
                int food1 = pq.poll();
                int food2 = pq.poll();
                
                if(food1 >= K)
                    break;
                else {
                    answer += 1;
                    int newFood = food1 + food2 * 2;
                    pq.offer(newFood);
                }
            } else {
                int food = pq.poll();
                if(food >= K)
                    break;
                else {
                    return -1;
                }
            }
        }
    
        return answer;
    }
}

+ Recent posts