728x90

문제 172. (2022-02-02)

 

 

11279번: 최대 힙

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

www.acmicpc.net

Baekjoon 11279. 최대 힙

[파이썬(python) 풀이]

널리 잘 알려진 자료구조 중 최대 힙이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.

  1. 배열에 자연수 x를 넣는다.
  2. 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.
    프로그램은 처음에 비어있는 배열에서 시작하게 된다.

 


입력

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수이다.

 


출력

입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 출력하면 된다.

 


입력 예시

13
0
1
2
0
0
3
2
1
0
0
0
0
0

 


출력 예시

0
2
1
3
2
1
0
0

 


❧ 정답

 

👉 힙(heap) : 우선 순위 큐 자료구조
👉 힙은 항상 오름차순으로 정렬된 상태를 유지한다.

  • heapq.heappush(heap, item)
    : 힙에 아이템을 넣는다.
  • heapq.heappop(heap)
    : 힙에서 가장 작은 값을 반환한다.
  • heapq.heappushpop(heap, item)
    : 힙에 아이템을 넣고 가장 작은 값을 반환한다. (push -> pop)
  • heapq.heapify(x)
    : 리스트 x를 힙으로 만든다.
  • heapq.heapreplace(heap, item)
    : 힙에서 가장 작은 값을 반환하고 아이템을 넣는다. (pop -> push)

 

🔑 최대 힙의 반대로 구현해야 하므로 힙에 '-1'를 곱하여 정렬한다.
 └ 역순으로 정렬된다.

  • 힙에 튜플 형태로 ([음수값], [원래값]) 을 저장한다.
  • 이때 힙은 첫 번째 원소를 기준으로 정렬된다.

 

Reference

 

heapq — Heap queue algorithm — Python 3.10.2 documentation

heapq — Heap queue algorithm Source code: Lib/heapq.py This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. Heaps are binary trees for which every parent node has a value less than or equal to an

docs.python.org

 

728x90