[알고리즘] 최대 힙 (Heap)

(문제) 최대 힙


최대힙은 완전이진트리로 구현된 자료구조입니다.

그 구성은 부모 노드값이 왼쪽자식과 오른쪽 자식노드의 값보다 크게 트리를 구성하는 것입니다.

그렇게 하면 트리의 루트(root)노드는 입력된 값들 중 가장 큰 값이 저장되어 있습니다.

예를 들어 5 3 2 1 4 6 7순으로 입력되면 최대힙 트리는 아래와 같이 구성됩니다.

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

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

입력설명

첫 번째 줄부터 숫자가 입력된다.

입력되는 숫자는 100,000개 이하이며 각 숫자의 크기는 정수형 범위에 있다.

출력설명

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

테스트케이스

입력예제 출력예제
5
3
6
0
5
0
2
4
0
-1
6
5
5
95
0
41
71
96
79
5
0
8
98
86
32
23
6
75
0
92
37
13
66
77
44
89
-1
95
96
98

해결방법

Python에 리스트최소힙 처럼 만들어주는 heapq 함수가 존재하여

해당 최소힙을 만드는 heapq를 응용해서 문제를 해결

최소힙은 가장 작은 수를 루트 node로 올리기 때문에 입력을 할 때, - 값을 앞에 붙여서 push를 하면, 가장 큰 수가 가장 작아지기 때문에 맨위로 올라간다.

pop을 할 경우, -를 붙여서 pop을 시킨다.

동작 시각화






코드

import heapq as hq

a = []

while True:
    num = int(input())

    # pop 시키라고 했을 경우
    if num == 0:
        # 리스트에 값이 없을 경우
        if len(a) == 0:
            print(-1)
        else:
            print(-hq.heappop(a))

    # 루프문 종료
    elif num == -1:
        break

    # 값이 들어올 경우 append(push) 시키기
    else:
        hq.heappush(a, -num)

댓글남기기