[알고리즘] 최소 힙 (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
3
5
2
95
0
41
71
96
79
5
0
8
98
86
32
23
6
75
0
92
37
13
66
77
44
89
95
5
6

해결방법

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

import heapq

해당 코드를 이용하여 리스트를 최소 힙으로 설정

동작 시각화

실질적인 최소 힙 실행 사항

참고 : https://cwadven.github.io/data_structures/heap/


코드

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)

댓글남기기