[알고리즘 풀이 분석] Programmers 더 맵게
더 이상 미룰 수 없을 때 까지 미룬,, 나의 알고리즘,, ㅎ,,
해결한 문제를 리뷰하며 더 좋은 풀이를 기반으로 나아질 점을 기록해보고자 한다!
Programmers 더 맵게
문제는 여기서 확인!
코딩테스트 연습 - 힙 - level 2
문제 목표
scoville 배열로 들어오는 모든 음식들의 스코빌 지수를 K 이상으로 만들기
입출력 예
제한 사항
- scoville의 길이는 2 이상 1,000,000 이하입니다.
- K는 0 이상 1,000,000,000 이하입니다.
- scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
- 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
나의 풀이
#include <vector>
#include <queue>
using namespace std;
int solution(vector<int> scoville, int K) {
int answer = 0;
int mixcount = 0;
priority_queue<int, vector<int>, greater<int>> minHeap;
for(int i=0; i<scoville.size(); i++){
minHeap.push(scoville[i]);
}
while(!minHeap.empty()){
if(minHeap.size() == 1){
if(minHeap.top() < K) answer=-1; // 불가능한 경우
else answer = mixcount;
break;
}else{ //원소가 2개 이상
if(minHeap.top() >= K){
answer = mixcount;
break;
}
int first = minHeap.top();
minHeap.pop();
int second = minHeap.top();
minHeap.pop();
int mixed = first + 2*second;
minHeap.push(mixed);
mixcount++;
}
}
return answer;
}
문제 자체가 힙 카테고리에 속해 있었기에 쉽게 우선순위 큐 사용을 유추할 수 있었다. 모든 음식이 K 이상의 스코빌 지수를 자겨야 했기에 최소 힙을 사용하여 접근하였다.
주어진 scoville을 최소 힙에 대입하고 힙의 최상단에 위치한 원소의 값이 주어진 K값 이상일 때 까지 반복적으로 주어진 연산을 수행한다.
이 때, 반복적으로 연산을 수행하다가 힙의 마지막으로 남은 1개의 원소마저 K보다 작은 경우 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우로 판단하여 -1 을 return 하였다.
다른 사람의 풀이
( 문제를 맞춘 후 다른 사람의 풀이 보기를 참고)
풀이 방식은 나와 다를 것이 없었다.
우선순위 큐를 사용하였고 최소 힙의 특성을 이용해서 푼 풀이였다.
하지만 주어진 scoville 배열을 탐색하며 최소힙에 일일이 push 하지 않고 우선순위 큐를 선언함과 동시에 힙을 완성시키는 방법을 새롭게 알 수 있었다!
priority_queue<int, vector<int>, greater<int>> pq (scoville.begin(), scoville.end());
내 코드보다는 보다 간결하고, 가독성 있는 코드로 작성되어 있는 코드 같다!
Author And Source
이 문제에 관하여([알고리즘 풀이 분석] Programmers 더 맵게), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nnnyeong/알고리즘-풀이-분석-Programmers-더-맵게저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)