💻공부/Algorithm
[프로그래머스] - 더 맵게
강켄트
2023. 1. 12. 19:00
힙(Heap)
모든 요소의 값이 k 이상이 될 때까지 아래의 방법을 사용해서 다시 배열에 넣어준다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
모든 요소의 값이 k보다 커질 때 까지의 횟수를 구하는 문제!
우선순위 큐에 스코빌 지수가 담긴 음식들을 넣으면 루트노드는 가장 맵지 않은 음식의 스코빌 지수 가 된다.
따라서 큐에서 값을 두개 꺼내면 해당 공식의 인자를 구할 수 있다.
두 음식을 섞어 다시 큐에 집어 넣으며 루트 노드가 K이상일 경우 or 더는 섞을 음식이 없을 경우까지 반복한다.
뽑아야 하는 것 2개(우선순위)
가장 덜 매운 음식, 그 다음으로 덜 매운 음식
import java.util.PriorityQueue;
class Heap {//더 맵게
//모든 요소의 값이 k보다 커질 때 까지!의 횟수를 구하는 문제
public int solution(int[] scoville, int K) {
int answer = 0;
PriorityQueue<Integer> heap = new PriorityQueue<>(); //우선순위 큐 선언
for(int OneScoville : scoville){ //반복문 돌면서
heap.offer(OneScoville); //하나씩 큐에 삽입
}
while (heap.peek() < K){ //반환값이 k보다 작거나 같을 경우 돌면서(반환된거지 삭제가 아님)
if(heap.size()==1){ //scoville 길이는 2 이상인데 그 이하면
return -1; //스코빌 지수 k 이상으로 못 만드니까 -1 리턴
}
//큐에서 꺼낸 값 2개 = 공식에 집어넣을 값
int a = heap.poll();//큐 맨 앞에 있는 값 반환 후 삭제, 비어있으면 null
int b = heap.poll();//그 다음으로 앞에 있는 값 반환 후 삭제, 비어있으면 null
int result = a + (b * 2); //문제에서 제시한 방법
heap.offer(result); //이거 안해도 되는건가?
answer ++; //answer = answer + 1;
}
return answer;
}
}
- offer() : 해당 큐 맨 뒤에 값 삽입, 성공시 true를 실패시 false를 반환
- peek() : 큐의 맨 앞에 있는 값 반환, 비어있을 경우 null 반환
- poll() : 큐 맨 앞에 있는 값 반환 후 삭제, 비어있을 경우 null 반환
횟수 | 가장 매운 | 그 다음 매운 | 섞은 음식 스코빌 지수 | scovile |
+1 | 1, 2, 3, 9, 10, 12 | |||
+1 | 1 | 2 | 1+(2*2)=5 | 5, 3, 9, 10, 12 |
3 | 5 | 3+(5*2)=13 | 13, 9, 10, 12 |
총 횟수는 2회