[프로그래머스/Level 2] 더 맵게

OOING·2023년 10월 19일
0

백준+알고리즘 공부

목록 보기
55/75

더 맵게

매운 것을 좋아하는 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 합니다.

코드

#include <string>
#include <vector>
#include <queue>
using namespace std;

int solution(vector<int> scoville, int K) {
  priority_queue<int, vector<int>, greater<int>> pq;
    for(int i : scoville) pq.push(i);
    int answer = 0;
    while(pq.top() < K) {
        ++answer;
        int first = pq.top();
        pq.pop();
        if(pq.empty()) return -1;
        int second = pq.top();
        pq.pop();
        first = first + second * 2;
        pq.push(first);
    }
    return answer;
}

기타

분류가 으로 되어있지만 우선순위 큐 를 이용해서 풀었다.
이유는 힙에도, 우선순위 큐에도 약하기 때문이다.
그리고 계속해서 정렬해야 하는 문제에서 우선순위 큐가 효율이 좋다!
처음에는 이분 탐색으로 섞은 음식의 스코빌 지수를 insert 하는 방식으로 구현했는데, 이렇게 했더니 효율성 테스트에서 전멸했다🙀 그런데 당장 어제도!! 이분탐색에서 모두 시간 초과가 떴었어서 우선순위 큐를 이용했다!!

profile
HICE 19

0개의 댓글