반응형

이번에 우선순위 힙을 사용하여 푸는 알고리즘 문제가 등장하였다.

오늘도 계속해서 달려보자.

*본인은 C++로 코딩할 예정이다.


1. 문제

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다.

모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은

두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

 

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

 

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때,

모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는

최소 횟수를 return 하도록 solution 함수를 작성해주세요.

 

출저 - 프로그래머스



2. 사고 - 우선순위 힙

1. 하나씩 비교해서 최솟값을 찾아, 계산해나가면 O(n^2) 이상의 복잡도를 가지게 된다. > 효율이 낮다.

2. 우선순위 힙을 선언한다. > greater 기준으로 정렬한다.

3. 힙의 가장 작은 수를 꺼내고, 그 다음 작은 수를 꺼내서 정해진 연산을 수행한다.

4. 결과 값을 다시 힙에 넣는다.

5. 가장 작은 수가 K를 넘어서면 카운트를 반환한다.
6. 길이가 1이거나, 힙이 비어있는 상황 등 다양한 예외 처리를 진행한다.

7. 힙을 이용하므로 시간복잡도는 O(NlogN)을 가지게 된다.


3. 코딩

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

int solution(vector<int> scoville, int K) {
    int answer = 0;
    int min1 = 0, min2=0, newq=1;
    priority_queue<int, vector<int>, greater<int>> pq; //작은 순서대로 정렬하는 우선순위 큐
    for (auto&i : scoville) pq.push(i);
    if (pq.size() == 1) {
        if (pq.top() >= K) return answer;
        return -1;
    }
    while (!pq.empty() && pq.size() > 1 && newq > 0) {
    	//cout << q.top() << endl;
        min1 = pq.top(); //최소 값 저장
        pq.pop();
        min2 = pq.top(); //그 다음 최소 값 저장
        pq.pop();
        newq = min1 + (min2 * 2); //연산
        pq.push(newq); //결과 값 큐에 저장
        answer++; //카운트 증가
        if (pq.top() >= K) return answer; //최소 값이 K 이상이면 answer 반환
    }
    return -1; //나올수 없는 경우엔 -1 반환
}

int main(void) {
    vector<int> scoville;
    int K = 7;
    scoville.push_back(1);
    scoville.push_back(2);
    scoville.push_back(3);
    scoville.push_back(9);
    scoville.push_back(10);
    scoville.push_back(12);
    cout << solution(scoville, K) << endl;
    return 0;  
}

- scoville = [1, 2, 3, 9, 10, 12], K=7

 

- 과정1 : 1 + (2*2) = 5

> [3, 5, 9, 10, 12], answer : 1

 

- 과정2 : 3 + (5*2) = 13

> [9, 10, 12, 13], answer : 2, K보다 9가 크므로 answer 반환

 

- 결과 : 2

 



4. 알게된 것

heap은 유용하다!

위와 같이 heap을 이용해서 최대, 최솟값을 손쉽게 뽑아낼 수 있다.

이러한 점을 이용하여 복잡한 알고리즘을

좀 더 빠른 시간복잡도안에 결과를 도출할 수 있다.

heap과 priority heap을 이용해서 상황에 맞게 잘 구현해보자.

 


맵고 짜고 단거

반응형

+ Recent posts