프로그래밍응용/오답노트

우선순위 큐 이용한 문제 ㅋㅋ

photoner 2021. 2. 13. 21:18
728x90
반응형

출처

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int solution(vector<int> scoville, int K) {
    priority_queue<intvector<int>, greater<int>> pq; // 우선순위 큐 | Min Heap
    // priority_queue<int, vector<int>, greater<int> > pq; // 우선순위 큐 | Max Heap
    int answer = 0;
    int n1, n2;
    
    for(auto n : scoville) 
        pq.push(n); // Min Heap의 우선순위 큐에 모두 때려 넣는다 -> 스코빌 지수가 작은 녀석들부터 순서대로 튀어나온다
    
    while(pq.size() > 1 && pq.top() < K) // 큐에 2개 이상 들어가야만 세그멘테이션 폴트 에러가 발생하지 않는다.
    {
        // 두 개를 뽑고,
        n1 = pq.top(); pq.pop();
        n2 = pq.top(); pq.pop();
        
        // 두 음식을 섞어서 새롭게 스코빌 지수를 하나 탄생시키고 넣으면
        pq.push(n1+n2*2); // 해당 힙에 구조가 조정되어 들어간다 -> Min Heap 계속 유지하기 때문에 top이 K 이상이라면 나머지 값들도 모두 K이상을 만족
        answer++;
    }
    
    if(pq.top() < K) // 위 과정을 거쳤는데도 K 이상을 충족하지 않는다면
        return -1// 더 이상 조합으로는 K 이상으로 맞출수 없다는 소리이다. 음식이 1개 남았고, K미만인 경우임.
    
    return answer;
}
cs

 

728x90
반응형