Publish:

태그: ,

카테고리:

https://school.programmers.co.kr/learn/courses/30/lessons/42626
난이도 ⭐⭐

문제

42626
42626


나의 풀이

처음엔 단순하게 vector와 sort를 이용해서 처리하려고 했는데, 그랬더니 효율성에서 다 실패하고 말았다.
그래서 삽입된 요소들을 내부에서 정렬해주는 우선순위 큐를 사용했다.

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
33
34
35
36
37
38
#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(vector<int> scoville, int K)
{
    int answer = 0;

    priority_queue<int, vector<int>, greater<int>> queue(scoville.begin(), scoville.end());

    // 스코빌 지수를 K 이상으로 만들기 위해 음식을 섞어야 하는 횟수를 구하는 것  
    //섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)  

    // queue 안에 원소가 2개 이상 있을 때,
    // 제일 첫 원소가 K 보다 작다면 (크면 섞을 필요 X)
    while (queue.size() > 1 && queue.top() < K)
    {
        int first = queue.top();
        queue.pop();

        int second = queue.top();
        queue.pop();

        queue.push(first + (second * 2));
        answer++;
    }

    // 위의 반복문을 돌았다는 가정하에 queue 안에 원소가 남아있고, 첫 원소가 K보다 작다면  
    // 아무리 섞어도 K이상 만들 수 없다는 것으로 판단하여 -1 반환  
    if (queue.size() > 0 && queue.top() < K)
    {
        return -1;
    }

    return answer;
}

이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기