알고리즘 & 코딩테스트
[백준] 11279번 최대힙
Haksae
2022. 3. 12. 11:53
⛏ 문제 파악
- 최대힙을 구하는 문제
- 시간초과 때문에 heapq을 임포트 안하고 그냥 구현하면 시간초과가 뜬다
- 파이썬 내장모듈인 heapq은 최소힙만 지원하기 때문에 최대힙으로 사용하기 위해서는 값을 음수로 변환하는 방법을 사용해야한다.
- 음수로 변환하는 것은 튜플이나 리스트를 이용하거나, 값에 * -1을 하는 방법이 있다.
👉🏻 답안
from sys import stdin
import heapq
N = int(stdin.readline())
heap = []
for i in range(N):
x = int(stdin.readline())
if x != 0:
heapq.heappush(heap, [-x, x])
elif x == 0:
if heap:
print(heapq.heappop(heap)[1])
else:
print("0")
👉🏻 또 다른 방법
import sys
import heapq
n = int(input())
heap = []
for i in range(n):
a = int(sys.stdin.readline())
if a == 0:
if heap:
print((-1)*heapq.heappop(heap))
else:
print(0)
else:
heapq.heappush(heap,(-1)*a)
📑 간단한 설명
- 본인은 리스트를 이용하여 최대힙을 구하는 방식을 활용했다.
- heapq 함수
- heapq.heappush(heap, item) : item을 heap에 추가
- heapq.heappop(heap) : heap에서 가장 작은 원소를 pop & 리턴. 비어 있는 경우 IndexError가 호출됨.
- heapq.heapify(x) : 리스트 x를 즉각적으로 heap으로 변환함 (in linear time, O(N) )
- 입력받은 값이 0인 아닌 경우, heappush(heap, [-x, x])이다.
- 입력받은 값이 0인 경우, 1) heap이 있으면 heappop[1]을 한다. 가장 작은 값이 pop되므로 -x는 가장 큰 값이 되고, return은 [1]로 양수 값이 리턴된다.
- 2) 비어있으면 0을 출력한다.