연습장/백준(BOJ) 문제풀이

[백준 1927] 최소 힙 with Python

Tesseractjh 2021. 8. 2. 11:41

문제 링크

https://www.acmicpc.net/problem/1927

 

1927번: 최소 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

풀이

import sys

class Heap:
	def __init__(self):
		self.arr = []

	def heapify_down(self, k, n):
		while 2*k+1 < n:
			L, R = 2*k+1, 2*k+2
			if L < n and self.arr[L] < self.arr[k]: m = L
			else: m = k
			if R < n and self.arr[R] < self.arr[m]: m = R
			if m != k:
				self.arr[k], self.arr[m] = self.arr[m], self.arr[k]
				k = m
			else: break

	def heapify_up(self, k):
		while k > 0 and self.arr[(k-1)//2] > self.arr[k]:
			self.arr[(k-1)//2], self.arr[k] = self.arr[k], self.arr[(k-1)//2]
			k = (k-1)//2

	def insert(self, key):
		self.arr.append(key)
		self.heapify_up(len(self.arr)-1)

	def delete_min(self):
		if len(self.arr) == 0: return "0"
		self.arr[0], self.arr[-1] = self.arr[-1], self.arr[0]
		key = self.arr.pop()
		self.heapify_down(0, len(self.arr))
		return str(key)

N = int(sys.stdin.readline())
heap = Heap()
output = []
for i in range(N):
	x = int(sys.stdin.readline())
	if x: heap.insert(x)
	else: output.append(heap.delete_min())
print("\n".join(output))

최소 힙을 직접 구현하여 해결하였다.

 

Python의 heapq 모듈은 최소힙을 구현한 모듈로, 이를 활용하면 쉽게 해결할 수 있다.

import sys
import heapq

N = int(sys.stdin.readline())
heap = []
output = []
for i in range(N):
	x = int(sys.stdin.readline())
	if x: heapq.heappush(heap, x)
	else: output.append(heapq.heappop(heap)) if heap else output.append(0)
print("\n".join(map(str, output)))