본문 바로가기

알고리즘

파이썬) 최대 힙 - BOJ

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

 

11279번: 최대 힙

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

www.acmicpc.net

 

힙은 흔히 최소값을 출력하고 제거할 수 있다.

그렇다면 힙을 이용해 최대값을 출력할 수 있을까?

정답은 바로 아래 코드이다

import heapq
import sys

input = sys.stdin.readline

n = int(input())

heap = []

for _ in range(n):
    x = int(input())

    if x == 0:
        if not heap:
            print(0)
        else:
            # 가장 작은(절대값이 가장 큰 값)을 빼내 부등호를 바꿈
            print(-heapq.heappop(heap))

    else:
        # 부등호 바꿔서 저장
        heapq.heappush(heap, -x)

저장과 출력의 부등호를 뒤집어 주면 된다.

만약 [1,2,3,4,5]라는 배열을 최대힙으로 나타낸다면 [-5,-4,-3,-2,-1]이 되고 여기서 heapq.heappop을 한다면 -5가 출력될 것이다. 

그 상태엥서 부등호를 반대로 돌려주면 최대힙이 된다.

'알고리즘' 카테고리의 다른 글

파이썬) 일곱 난쟁이 - BOJ  (0) 2023.11.23
파이썬) 로봇 프로젝트 - BOJ  (0) 2023.11.22
파이썬) 회전초밥 - BOJ  (0) 2023.11.20
파이썬) 비슷한 단어 - BOJ  (0) 2023.11.19
파이썬) 공유기 설치 - BOJ  (0) 2023.11.13