[백준][python] 11279번: 최대 힙
11279번: 최대 힙
문제
널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.
- 배열에 자연수 x를 넣는다.
- 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
입력 조건
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다.
다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다.
만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고,
x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다.
입력되는 자연수는 231보다 작다.
출력 조건
입력에서 0이 주어진 회수만큼 답을 출력한다.
만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 출력하면 된다.
첫 번째 시도 .
import sys
import heapq
input = sys.stdin.readline
n = int(input())
heap=[]
for i in range(n):
cmd = int(input())
if cmd !=0:
# -1을 곱하여 heap자료구조에 저장.
heapq.heappush(heap,-cmd)
else:
if heap:
#heappop을 이용하면 최소값이 리턴됨 하지만 우리는 -1을 곱하였음으로
#리턴 후 -1을 다시 곱하면 그 값은 원래 자료들 중 가장 큰값이다.
print(-heapq.heappop(heap))
else:
print(0)
»intput
13
0
1
2
0
0
3
2
1
0
0
0
0
0
»output
0
2
1
3
2
1
0
0
success
🌝 Thinking
heapq모듈은 heappop 이라는 함수를 가지고 있는데 이는 heap에서 최소값
을
제거하고 그 값을 리턴하는 함수이다.
최소힙을 이용하여 최대힙을 구현할 수 있는데,
바로 힙에 값들을 -1 를 곱하여 저장하는 것이다. 부호가 반대가 되면 대소 관계가
모두 반대로 뒤집힐 것이다.
따라서 heappop함수를 이용하여 값을 출력 한다음 다시 -1을 곱해 준다면 ,
결과적으로는 가장 큰값이 리턴되어진다.
💡 깨달은 점.
- 파이썬에서는 우선순위 큐, 자료구조를 쉽게 다룰 수 있는 heapq라는 모듈이 있다.
- heapq 모듈은 최소값을 우선순위로하는 자료구조인데, 우리는 - 부호를 이용하여 최대값이 우선순위인 힙 또한 간편하게 구현이 가능하다.
댓글남기기