11279번: 최대 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이
www.acmicpc.net
<내 코드>
import heapq
from sys import stdin
N = int(stdin.readline())
heap = []
for i in range(N):
num = int(stdin.readline())
if num == 0:
if heap:
print(-heapq.heappop(heap)) # 음수된 값에서 가장 작은 것 빼서 다시 음수하면 최대값임
else:
print(0)
else:
heapq.heappush(heap, -num) # 음수처리해 최대힙처럼 구성
파이썬에서는 최소 힙만 제공해준다. 따라서 이 문제에서는 최대 힙을 활용해야 하기에 기본 힙 모듈을 최대 힙으로 구현했다.
방식은 여러 가지가 있는 것 같다. 내가 사용한 방법은 우선 heappush를 할 때 넣어주는 값을 음수 처리를 해준다.
그다음 heappop으로 값을 꺼내면 최솟값이 나오는데 이것을 다시 음수를 해주면 최댓값이 된다.
아래는 튜플, 리스트 형식을 활용한 방식이다.
import heapq
from sys import stdin
N = int(stdin.readline())
heap = []
for i in range(N):
num = int(stdin.readline())
if num == 0:
if heap:
print(heapq.heappop(heap)[1]) # 값은 리스트or 튜플형태로 나오기에 1번째 요소를 뽑으면 값이 된다.
else:
print(0)
else:
heapq.heappush(heap, [-num, num]) # 값을 넣을 때 반대로 우선순위 처리해준다. (우선순위, 값)
반응형
'알고리즘 문제풀기 > 백준 - Python' 카테고리의 다른 글
[백준 11286] 절댓값 힙 - Python (우선순위 큐, 힙) (0) | 2020.10.23 |
---|---|
[백준 1927] 최소 힙 - Python( 우선순위 큐, 힙) (0) | 2020.10.23 |
[백준 10973] 이전 순열 - Python (순열) (0) | 2020.10.22 |
[백준 1476] 날짜 계산 - Python (브루트포스) (0) | 2020.10.22 |
[백준 2309] 일곱 난쟁이 - Python (브루트포스) (0) | 2020.10.21 |