안녕하세요. 오늘은 프로그래머스 더 맵게 문제를 풀어보겠습니다.
더 맵게는 데이터중에서 가장 작은 숫자를 가져오는 시간이 중요한 문제입니다.
데이터 자체가 완벽하게 정렬이 되어있지 않더라도 항상 가장 작은 숫자를 가져오기 편한 자료구조를 생각해보면 힙(HEAP)이 있습니다.
priority_queue자료구조를 사용해도 되지만 저는 예전에 만들어 놓은 힙 자료구조가 있길래 가져와 봤습니다!
C로 구현된 자료구조라 OOP가 아니라 코딩하는데 익숙하지 않더라구요 허헣....
다음에 자료구조 모두 C++로 만들어 놔야겠네요 ㅠ
더 맵게 문제는 힙을 이용해 가장 작은 두 수를 가져와서 합쳐서 다시 힙에 넣는걸 반복하면서 모든 값이 K이상임을 확인해주면 됩니다.
제가 구현한 힙은 가장 작은값이 1번 인덱스에 오기때문에 K를 1번과 비교하면 한번만 비교할 수 있습니다!
그리고 마지막에 데이터 사이즈가 1이면서 그 값이 K미만일 때 -1을 리턴해주고 아니면 answer(반복횟수)를 입력해주시면 문제가 해결 됩니다.
#include <string>
#include <vector>
using namespace std;
void swap(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}
typedef struct heap {
int dataArray[1000001];
int size;
} heap;
void initHeap(heap* pHeap){
pHeap->size = 0;
}
void insert(heap* pHeap, int data) {
int position = ++pHeap->size;
while((position != 1) && (data < pHeap->dataArray[position/2])) {
pHeap->dataArray[position] = pHeap->dataArray[position/2];
position /= 2;
}
pHeap->dataArray[position] = data;
}
int deleteData(heap *pHeap) {
int result = pHeap->dataArray[1];
pHeap->dataArray[1]= pHeap->dataArray[pHeap->size--];
int parent = 1;
int child;
while (1) {
child = parent * 2;
if (child + 1 <= pHeap->size && pHeap->dataArray[child] > pHeap->dataArray[child + 1])
child++;
if (child > pHeap->size || pHeap->dataArray[child] > pHeap->dataArray[parent])
break;
swap(&pHeap->dataArray[parent], &pHeap->dataArray[child]);
parent = child;
}
return result;
}
int solution(vector<int> scoville, int K) {
int answer = 0;
heap scovilleData;
initHeap(&scovilleData);
for (int i = 0; i < scoville.size(); i++) {
insert(&scovilleData, scoville[i]);
}
while (scovilleData.dataArray[1] < K && scovilleData.size != 1) {
answer++;
int newScovilleData = deleteData(&scovilleData) + 2 * deleteData(&scovilleData);
insert(&scovilleData, newScovilleData);
}
if(scovilleData.size == 1 && scovilleData.dataArray[1] < K) return -1;
return answer;
}
'Algorithm Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습 2017 팁스타운 짝지어 제거하기 with Swift (0) | 2021.12.21 |
---|---|
[프로그래머스] 깊이/너비 우선 탐색(DFS/BFS) 타겟 넘버 with Swift (0) | 2021.12.20 |
[프로그래머스] 코딩테스트 연습 Summer/Winter Coding(2019) 멀쩡한 사각형 with Swift (0) | 2021.12.15 |
[프로그래머스] 코딩테스트 연습 2017 카카오코드 본선 단체사진 찍기 with C++(brute force) (0) | 2021.12.14 |
[프로그래머스] 코딩테스트 연습 2017 카카오코드 예선 카카오프렌즈 컬러링북 with C++ (0) | 2021.12.14 |