백준 11279 - 최대 힙
Updated:
C++
11279 번 - 최대 힙
문제
널리 잘 알려진 자료구조 중 최소 힙이 있다. 최소 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.
- 배열에 자연수 x를 넣는다.
- 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.
입력에서 0이 주어진 회수만큼 답을 출력한다.
만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 출력하면 된다.
접근 방법
최대 힙의 개념과 응용 방법에 대해 제시하는 문제이다.
최소 힙와 동일한 문제로, 최대 값이 Root Node가는 최대 힙이다.
구현
Heap에 대한 구조와 Insert / Delete를 Class로 구현하여 이후에도 사용할 수 있도록 만들었다.
코드
#include <iostream>
#include <vector>
using namespace std;
class MaxHeap {
private:
int size;
int* arr;
public:
MaxHeap(int maxSize) {
size = 0;
arr = new int[maxSize];
}
int Delete() {
if (size == 0)
return -1;
int retV = arr[1];
int parent = 1, child;
arr[1] = arr[size];
size--;
while (1) {
child = parent * 2;
if (child + 1 <= size && arr[child] < arr[child + 1])
child++;
if (child > size || arr[child] < arr[parent])
break;
swap(arr[child], arr[parent]);
parent = child;
}
return retV;
}
void Insert(int data) {
int here = ++size;
while (here != 1 && data > arr[here / 2]) {
arr[here] = arr[here / 2];
here /= 2;
}
arr[here] = data;
}
};
int n;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
int curN;
MaxHeap maxHeap = MaxHeap(100001);
while (n--) {
cin >> curN;
// Delete
if (curN == 0) {
int delR = maxHeap.Delete();
if (delR == -1)
cout << "0" << "\n";
else
cout << delR << "\n";
}
// Insert
else {
maxHeap.Insert(curN);
}
}
return 0;
}
총평
난이도
⭐★★★★
후기
최소 힙을 통해 공부한 내용을 복기하며 최대 힙 클래스를 구현하였다.
개선할 점
차후 절댓값 힙 문제를 통해 복습 할 필요가 있다.