이번에 우선순위 힙을 사용하여 푸는 알고리즘 문제가 등장하였다.
오늘도 계속해서 달려보자.
*본인은 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을 이용해서 상황에 맞게 잘 구현해보자.
맵고 짜고 단거
'Programming > Algorithms' 카테고리의 다른 글
[알고리즘/프로그래머스] 여행경로 - C++ (0) | 2020.07.15 |
---|---|
[알고리즘/프로그래머스] N으로 표현 - C++ (0) | 2020.07.14 |
[알고리즘/프로그래머스] 큰 수 만들기 - C++ (0) | 2020.07.07 |
[알고리즘/프로그래머스] 가장 큰 수 - C++ (0) | 2020.07.05 |
[알고리즘/프로그래머스] 체육복 - C++ (0) | 2020.07.05 |