문제/백준_파이썬

184. 11286(절댓값 힙) - 파이썬

sm_hope 2022. 8. 22. 18:17
from queue import PriorityQueue
import sys
input = sys.stdin.readline

N = int(input())
que = PriorityQueue(maxsize=N)
result = []

for _ in range(N):
    X = int(input())

    if(X == 0):
        if que.empty():
            result.append("0")
        else:
            tmp = que.get()
            if tmp[1] < 0:
                result.append(str(-tmp[0]))
            else:
                result.append(str(tmp[0]))

    else:
        if X > 0:
            que.put([X, 1])
        else:
            que.put([-X, -1])

print("\n".join(result))

문제요약

값을 입력하는데 0이면 현재 입력된 값 중에 절대값 기준 가장 작은 값을 출력하라.(절대값이 같다면 더 작은 값 출력)

설명

이 문제는 굳이 우선순위 큐가 아닌 힙을 이용하여 (어차피 힙도 우선순위 큐) 풀 수 있다.

import sys
import heapq

n = int(sys.stdin.readline())
h = []

for _ in range(n):
    data = int(sys.stdin.readline())
    if data != 0:
        heapq.heappush(h,(abs(data),data))
    else:
        if not h:
            print(0)
        else:
            print(heapq.heappop(h)[1])

하지만 지금까지 PriorityQueue를 사용했기 때문에 이 문제에서도 우선순위 큐를 사용했다.

 

    else:
        if X > 0:
            que.put([X, 1])
        else:
            que.put([-X, -1])

먼저 que에 입력 되는 부분을 보자.

 

만약 X입력값이 음수라면 -를 붙이고 음수라는 것을 알리기 위해 배열 1에 [-1]을 붙여준다.

양수는 음수와 반대로 진행한다.

 

그러면 입력값을 양수로 기준으로 하여 값을 집어 넣을 것이다.

    if(X == 0):
        if que.empty():
            result.append("0")
        else:
            tmp = que.get()
            if tmp[1] < 0:
                result.append(str(-tmp[0]))
            else:
                result.append(str(tmp[0]))

0이 들어오면 result에 값을 추가하는데 큐가 비어있을 경우 전에 하던대로 진행하면 되고, 입력을 할 때가 문제이다.

 

먼저 tmp에 리스트를 저장한다.

tmp[1]이 음수냐 양수냐에 따라서 result에 -를 붙여줄지 안 붙여 줄지를 결정한다.

tmp[1]이 음수라는 것은 그 수는 본래 음수 였다는 것을 말하는 것이므로 result에 넣을 때 -를 붙여 본래의 값으로 만들어 준다.