본문 바로가기
프로그래머스

[프로그래머스] 힙(Heap) - 더 맵게, C++

by 황인태(intaehwang) 2020. 1. 6.
반응형

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

 

코딩테스트 연습 - 더 맵게 | 프로그래머스

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진

programmers.co.kr

 본 문제는 pripriority_queue를 이용하는 문제다. pripriority_queue는 max_heap, min_heap으로 구현 할 수 있다. 여기서 priority_queue 사용법을 간단히 설명하자면

  • min_heap : priority_queue<int, vector<int>, greater<int>> pq;
  • max_heap : priority_queue<int, vector<int>, less<int>> pq; 이다. heap에 대해 자세한 설명은 생략한다.

코딩 절차는 다음과 같다.

  1. 가장 맵지 않은 음식의 스코빌 지수 구하기
  2. 두 번째로 맵지 않은 음식 스코빌 지수 구하기
  3. 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)를 구하여 heap에 저장하기
  4. heap의 모든 값이 기준 값 이상이 될 때 까지 반복
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
32
#include <string>
#include <vector>
#include <queue>
 
using namespace std;
 
int solution(vector<int> s, int k) {
    int answer = 0;
    priority_queue<intvector<int>, greater<int>> pq;
    for (int i = 0; i < s.size(); i++) {
        pq.push(s[i]);
    }
    while (true) {
        // 모든 값이 기준 값 이상일 경우
        if (pq.top() >= k) break;
        // 스코빌 지수 구하기
        if (pq.top() < k) {
            int x = pq.top();
            pq.pop();
            int y = pq.top();
            pq.pop();
            int tmp = x + (y*2);
            pq.push(tmp);
            answer += 1;
        }
        if (pq.top() < k && pq.size() == 1) {
            answer = -1;
            break;
        }
    }
    return answer;
}
cs
반응형
Buy me a coffeeBuy me a coffee

댓글