my study.

Coding Test/Programmers

[프로그래머스] 더 맵게, java

fftl 2025. 2. 3. 21:07

- 문제

 

프로그래머스

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

programmers.co.kr

- 풀이

import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        
        //스코빌 지수가 가장 낮은 음식 두 개를 찾아 꺼내는 동작을 반복해야 합니다.
        //여기서 우선순위 큐 라는 자료구조를 생각할 수 있었습니다.
        
        //우선순위 큐는 다양한 기준으로 우선순위를 설정할 수 있지만, default가 수의 오름차순 정렬이기 때문에
        //그대로 사용합니다.
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        
        //scoville 배열의 수들을 pq에 담아줍니다.
        for(int a : scoville){
            pq.add(a);
        }
        
        //음식 섞기 횟수를 담아줄 count 변수입니다.
        int count = 0;
        
        //pq의 가장 앞의 값 즉 모든 음식의 최소 스코빌 지수가 K값보다 아래라면 계속 반복합니다.
        while(pq.peek() < K){
            
            //만약 음식이 하나밖에 남지 않았다면, 더 이상 음식 섞기가 불가능하므로 반복을 멈춥니다.
            if(pq.size() == 1) break;
            
            //가장 맵지 않은 음식 a, 두번째로 맵지 않은 음식 b를 꺼내줍니다.
            int a = pq.poll();
            int b = pq.poll();
            
            //음식을 섞어줍니다.
            pq.add(a+b*2);
            
            //섞은 횟수를 추가시켜줍니다.
            count++;
        }
    
        //음식을 섞은 후 최솟값이 K보다 작다면 answer에 -1을
        //아니라면 count를 담아줍니다.
        if(pq.peek()<K) answer = -1;
        else answer = count;
        
        //답을 반환합니다.
        return answer;
    }
}