Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

아무거나 내꺼 공부할래

[개념] 최대힙(priority_queue, 우선순위큐) / c++ / 제한시간 없음 본문

[c언어&c++] 알고리즘 공부/개념

[개념] 최대힙(priority_queue, 우선순위큐) / c++ / 제한시간 없음

mero95 2021. 2. 17. 18:14

▣ 문제

최대힙은 완전이진트리로 구현된 자료구조입니다. 그 구성은 부모 노드값이 왼쪽자식과 오른 쪽 자식노드의 값보다 크게 트리를 구성하는 것입니다. 그렇게 하면 트리의 루트(root)노드는 입력된 값들 중 가장 큰 값이 저장되어 있습니다. 예를 들어 5 3 2 1 4 6 7순으로 입력되면 최대힙 트리는 아래와 같이 구성됩니다.

최대힙 자료를 이용하여 다음과 같은 연산을 하는 프로그램을 작성하세요.

1) 자연수가 입력되면 최대힙에 입력한다.

2) 숫자 0 이 입력되면 최대힙에서 최댓값을 꺼내어 출력한다. (출력할 자료가 없으면 -1를 출력한다.)

3) -1이 입력되면 프로그램 종료한다.

 

▣ 입력설명

- 첫 번째 줄부터 숫자가 입력된다. 입력되는 숫자는 100,000개 이하이며 각 숫자의 크기는 정 수형 범위에 있다.

 

▣ 출력설명

- 2) 연산을 한 결과를 보여준다.

 

▣ 입력 예시

5
3
6
0
5
0
2
4
0
-1

 

▣ 출력 예시

6
5
5

 

<코드>

#pragma warning(disable:4996)
#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

int main() {
	int a;
	priority_queue<int> pQ;
	while (true) {
		scanf("%d", &a);
		if (a == -1) break;
		if (a == 0) {
			if (pQ.empty())printf("-1\n");
			else {
				printf("%d\n", pQ.top());
				pQ.pop();
			}
		}
		else pQ.push(a);
	}
	return 0;
}

우선순위큐(priority_queue)란 큐에 들어가는 자료들이 들어간 순서 상관없이 우선순위의 자료가 먼저 나오는것을 말한다. 원래 큐(Queue)는 FIFO의 특징을 가지지만, 우선순위큐는 힙(Heap)이라는 자료구조로 구현한다.

 

문제에서 언급한 것처럼 힙의 자료구조를 살펴보면 완전이진트리의 구조를 가지면서 우선순위의 자료가 부모노드는 항상 자식노드들 보다 큰 값을 가지게 된다. 그리고 자료가 들어가는 순서로는 왼쪽 자식 노드로 먼저 들어간 후에 오른쪽 자식 노드로 들어간다.

 

priority_queue<int> pQ;

이 라인이 우선순위큐의 객체를 만들어준다.

 

pQ.top( )은 트리의 루트노드를 뜻한다. 만약 루트 노드가 pop( )이 되면, 우선순위 큐중 맨 뒤에 있는 노드가 루트노드로 먼저 이동한다. 그리고 다시 우선순위의 자료를 따지게 된다. 이는 pop( )이 되면 자동적으로 해주니까 걱정안해도 된다.