문제
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
* 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- scoville의 길이는 2 이상 1,000,000 이하입니다.
- K는 0 이상 1,000,000,000 이하입니다.
- scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
- 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
입출력 예
scoville | K | return |
[1, 2, 3, 9, 10, 12] | 7 | 2 |
입출력 예 설명
- 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5
가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12] - 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
새로운 음식의 스코빌 지수 = 3 + (5 * 2) = 13
가진 음식의 스코빌 지수 = [13, 9, 10, 12]
모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.
풀이
1. 가장 낮은 지수를 가진 음식이 앞에 나와야 함으로 우선순위 큐 자료 구조이며 힙의 개념을 사용한다. PriorityQueue
2. 모든 음식의 지수가(K) 이상이 되야함으로 지수(K) 보다 작은 최소힙의 루트 노드 값(peek())을 비교하여 반복체크. while(peek() < K)
3. 가장 낮은 두 음식을 poll() 를 사용하여 스코빌 지수 계산식으로 계산한 다음 add() 후 횟수(answer++) 증가
4. 그 후 heap에 가지고 있는 값이 지수(K)보다 클 경우 종료
5. 제한 사항의 내용인 '모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 리턴'을 만족하는 조건을 넣는다.
코드
import java.util.PriorityQueue;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
PriorityQueue<Integer> minheap = new PriorityQueue();
for(int s : scoville){
minheap.add(s);
}
while(minheap.peek()<K){
int min1 = minheap.poll();
int min2 = minheap.poll();
// mix_scovil = min1_scovil + (min2_scovil*2)
int scovil = min1 + (min2*2);
minheap.add(scovil);
answer++;
if(minheap.peek() >= K) break;
if(minheap.size() == 1 && minheap.peek() < K){
answer = -1;
break;
}
}
return answer;
}
}
'코테 > 자료구조' 카테고리의 다른 글
[ Heap / 힙 ] - 이중우선순위큐(우선순위 큐) (0) | 2023.12.21 |
---|---|
[ Heap / 힙 ] - 디스크 컨트롤러(우선순위 큐) (1) | 2023.12.21 |
[ Stack, Queue / 스택, 큐 ] - 주식 가격(배열, 스택, (0) | 2023.12.20 |
[ Queue / 큐 ] - 다리를 지나는 트럭(큐) (1) | 2023.12.19 |
[ Queue / 큐 ] - 프로세스(우선순위 큐, 리스트) (0) | 2023.12.19 |