백준11286(파이썬) - 절댓값 힙

resilient

·

2021. 7. 7. 10:59

728x90
반응형

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

 

11286번: 절댓값 힙

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

www.acmicpc.net

  • 파이썬에는 heapq라는 라이브러리가 있어서 쉽게 heap 구현을 할 수 있다.
  • 파이썬의 heap은 기본적으로 최소 힙 (Min heap) 으로 구현 되어 있는데 이를 최대 힙이나 다른 조건의 heap으로 바꿔서 구현하려면 heap을 넣는과정에서 원래 값과, 조건값을 넣어주면 된다. 더 자세한 내용은 아래 게시물에서 참고하면 된다.

2021.05.19 - [Algorithm & Python/알고리즘 및 자료구조] - 자료구조 우선순위 큐(Priority Queue)와 힙(heap)

 

자료구조 우선순위 큐(Priority Queue)와 힙(heap)

먼저 우선순위 큐는 우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조이다. 우선순위 큐는 데이터를 우선순위에 따라 처리하고 싶을 때 사용한다. 스택(Stack) 자료구조에서 추출되는

resilient-923.tistory.com

 

그럼 이제 문제를 풀어보면 그 조건값에 절댓값을 넣어주면 되는 문제이다. 아래 코드를 보자.

 

  • h라는 리스트에 i라는 데이터를 heap을 구현하면서 넣을게 라는 의미인데
  • i를 넣지않고, (i,abs(i))를 넣어주면, abs(i)로 heap을 구현하게 된다.
  • 그 다음에 출력을 하게 될 경우에는 (i,abs(i))에서 i를 출력해주면된다.
import heapq
import sys
input = sys.stdin.readline

n = int(input())
data = []
for _ in range(n):
    data.append(int(input()))

h = []
result = []
for i in data:
    if i == 0:
        if len(h)>0:
            result.append(heapq.heappop(h))
        else:
            result.append(0)
    else:
    # 이부분이 h라는 리스트에 i라는 데이터를 heap을 구현하면서 넣을게 라는 의미인데
    # i를 넣지않고, (i,abs(i))를 넣어주면, abs(i)로 heap을 구현하게 된다.
    # 그 다음에 출력을 하게 될 경우에는 (i,abs(i))에서 i를 출력해주면된다.
        heapq.heappush(h,(i,abs(i)))
print(result)
for i in result:
    if i == 0:
        print(0)
    else:
        print(i[1])

 

반응형