프로그래머스 - 더맵게
문제 설명
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
https://programmers.co.kr/learn/courses/30/lessons/42626
소스코드(CPP) :
#include <string> #include <vector> #include <iostream> using namespace std; class MinHeap { vector<int> array; public: MinHeap() {} void insert(int x) { array.push_back(x); int target = array.size(); while( target > 1 && x < array[(target/2)-1]) { array[target-1] = array[(target/2)-1]; //cout << "target = " << target << ", target/2 = " << target/2 << endl; target /= 2; //cout << "target:" << target << endl; } //cout << "======end target========target:" << target << endl; array[target-1] = x; } int popMin() { //min is always first factor by heapify(insert) int min = array.front(); //end factor moves to first factor array.front() = array.back(); array.pop_back(); //heapify int x = array.front(); int parent=1, child=2; int arrSize = array.size(); while(child <= arrSize) { if(array[child-1] > array[child]) { child++; } if(x <= array[child-1]) { break; } array[parent-1] = array[child-1]; parent=child; child *= 2; } array[parent-1] = x; return min; } int getMin() { //min is always first factor by heapify(insert) return array.front(); } bool isEmpty() { if(array.empty()) return true; return false; } int factorSize() { return array.size(); } void print() { cout << endl << "=============print=============" << endl; for (vector<int>::const_iterator item=array.begin(); item != array.end();++item) { cout<<*item << " "; } cout << endl << "===============================" << endl; } void printtree(int index, int space) { if(array.size() < index) { return; } space += 4; printtree((index*2)+1, space); //right for(int i=4;i<space;i++) { cout << " "; } cout << array[index-1] << endl; printtree((index*2), space); //left } }; int solution(vector<int> scoville, int K) { int answer = 0; MinHeap minheap; for(const auto &elem : scoville) { minheap.insert(elem); } int scovilleScore=0; bool foundScore = false; //minheap.print(); while(minheap.factorSize()>1) { int low1 = minheap.popMin(); //cout << "min : " << low1 << ", K :" << K << endl; int low2 = minheap.popMin(); scovilleScore = low1 + (low2*2); minheap.insert(scovilleScore); answer++; //minheap.print(); //cout << "size : " << minheap.factorSize() << ", low1 :" << low1 << endl; if(minheap.getMin() >= K) { foundScore = true; break; } } if(!foundScore) answer = -1; return answer; }
해설
STL에서 제공하는 priority_queue를 사용할 수도 있지만, 직접 heap을 만들어 놓으면 언제 적절하게 사용해야하는 지 알 수 있기때문에 이전에 만든 heap을 활용했습니다.
문제는 가장 작은 2개의 scoville 지수를 가져오는것이기 때문에 min heap 정렬을 이용해서 가장 작은 2개의 scoville 지수를 계속 가져와 연산했습니다.
댓글
댓글 쓰기