Coding Test/BaekJoon_Python
백준 11286 <절댓값 힙> Python
JunOnJuly
2023. 12. 3. 16:39
728x90
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
절댓값을 비교해야 하기 때문에 최댓값 혹은 최솟값만을 찾을 수 있는 단일 힙으로는 구현이 힘들 것 같아 음수와 양수를 각각 담당하는 힙을 만들어 풀었습니다.
import sys
import heapq
def solution(N, data_list):
# 최대힙, 최소힙
max_heap = []
min_heap = []
# 음수는 최대힙에 넣고 양수는 최소힙에 넣음
for data in data_list:
# 입력이 0 이면
if not data:
# 둘 다 비어있으면 0
if not max_heap and not min_heap:
print(0)
# 최대힙만 차있으면
elif max_heap and not min_heap:
print(-heapq.heappop(max_heap))
# 최소힙만 차있으면
elif min_heap and not max_heap:
print(heapq.heappop(min_heap))
# 둘 다 있으면
else:
# 최소힙[0]의 절댓값이 작으면
if min_heap[0] < max_heap[0]:
print(heapq.heappop(min_heap))
# 최대힙[0]의 절댓값이 작으면
# 최대힙의 데이터는 음수라 무조건 최소힙의 데이터보다 작으므로 절댓값이 같아도
else:
print(-heapq.heappop(max_heap))
# 입력이 0 이 아니면
else:
# 입력이 양수면 최소힙에 푸시
if data > 0:
heapq.heappush(min_heap, data)
# 입력이 음수면 최대힙에 푸시
else:
heapq.heappush(max_heap, -data)
N = int(sys.stdin.readline())
data_list = [int(sys.stdin.readline()) for _ in range(N)]
solution(N, data_list)
728x90