백준 1927번 바로가기
첫 번째 시도#
# 입력
import sys
read = sys.stdin.readline
n = int(read().strip())
arr = []
# 처리
for _ in range(n):
x = int(read().strip())
if x == 0:
try:
print(arr.pop())
except:
print(0)
else:
arr.append(x)
arr.sort(reverse=True)
최종 제출#
# 입력
import heapq
n,*l = open(0)
heap = []
# 처리
for x in l:
if (x:=int(x)) == 0:
try:
print(heapq.heappop(heap))
except:
print(0)
else:
heapq.heappush(heap,x)
CODE REVIEW#
- 자료구조와 우선순위 큐의 구현 방법에 따른 시간 복잡도는 링크 참조!
우선순위 큐
를 구현하는 방법에는 여러가지가 있는데, 배열이나 연결 리스트를 이용할 경우 시간 복잡도가 (삽입,삭제) = (O(1),O(n)) 혹은 (O(n),O(1))로 나타난다.
- 삽입, 삭제를 모두 구현해야하는 이 문제에서는 O(n)의 시간복잡도는
시간초과
에러를 발생시킬 수 밖에 없다. 게다가 매번 x가 들어올 때마다 arr을 새로 정렬하니까 시간이 많이 걸릴 수 밖에.. 삽입할 때 오름차순을 헤치지 않는 알맞은 자리에 집어넣어야 시간을 절약할 수 있다.
- 따라서 삽입, 삭제 모두 시간복잡도가 O(logn)인 힙(heap)을 이용해서 우선순위 큐(priority queue)를 구현해보자.
- 힙(heap)을 스스로 구현하려다가 귀찮아서(…) 그냥 python에서 제공하는 heapq - 힙 큐 알고리즘을 이용했다.
- heapq 모듈의 documentation에 따르면…
- 삽입:
heapq.heappush(heap, item)
- 삭제:
heapq.heappop(item)
만일 힙이 비어있으면 IndexError
발생.
heapq
라는 매우 유용한 python 내장 모듈이 있음을 기억해두고, 최댓값/최솟값을 다루는 문제가 있다면 유용하게 써먹자!!