[알고리즘] 최대 힙 (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)
댓글남기기