'힙에서 최댓값 or 최소값은 루트(최상위 노드)에 위치한다' 라는 특징을 이용하여 정렬하는 알고리즘
아래의 과정을 반복하여 정렬
import sys
N = int(sys.stdin.readline())
heap = []
def heapAdd(value):
global heap
heap.append(value)
elem = len(heap)-1
while True:
if elem == 0:
break
try:
if heap[elem] >= heap[(elem-1)//2]:
heap[elem], heap[(elem-1)//2] = heap[(elem-1)//2], heap[elem]
elem = (elem-1)//2
else:
break
except:
break
def heapDelete():
global heap
if len(heap) == 0:
return 0
root = heap[0]
heap[0] = heap[-1]
heap.pop()
elem = 0
while True:
left = 2 * elem + 1
right = 2 * elem + 2
largest = elem
# 왼쪽 자식이 존재하고, 자식이 부모보다 크다면
if left < len(heap) and heap[left] > heap[largest]:
largest = left
# 오른쪽 ''
if right < len(heap) and heap[right] > heap[largest]:
largest = right
if largest == elem:
break
heap[elem], heap[largest] = heap[largest], heap[elem]
elem = largest
return root
result = []
for _ in range(N):
command = int(sys.stdin.readline())
if command == 0:
print(heapDelete())
else:
heapAdd(command)
-> 백준 1655번 답안
newRoot = heap.pop()
heap.reverse()
deleted = heap.pop()
heap.append(newRoot)
heap.reverse()
힙 요소 제거 함수의 루트를 빼내는 작업을 처음에 이런식으로 구현했었다. deque모듈을 쓰지 않았으니 빼고, 뒤집고, 빼고 하는 작업이 일반적인 리스트 연산보다 빠를 거라고 생각했다. 아니나 다를까 시간초과.. 이후 서칭을 통해 더 좋은 방법을 발견했고, 이를 적용하니 무사히 통과할 수 있었다.
root = heap[0]
heap[0] = heap[-1]
heap.pop()
elem = 0