알고리즘

[백준(BOJ)] 1927번 최소 힙, 11279번 최대 힙

욘아리 2024. 1. 7. 21:27

문제

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

 

1927번: 최소 힙

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

www.acmicpc.net

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

 

11279번: 최대 힙

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

www.acmicpc.net

주어진 연산에 따라 배열에 자연수를 추가하거나, 배열에서 가장 작거나 큰 값을 출력하고 제거하는 프로그램을 만드는 문제다.

예시

최소 힙 Example :

Input : 9
	0
	12345678
	1
	2
	0
	0
	0
	0
	32
Output : 0
	1
	2
	12345678
	0

 

최대 힙 Example :

Input : 13
	0
	1
	2
	0
	0
	3
	2
	1
	0
	0
	0
	0
	0
Output : 0
	2
	1
	3
	2
	1
	0
	0

풀이

import heapq
import sys

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

for _ in range(n):
    x = int(sys.stdin.readline())

    if x == 0:
        if arr:
            print(heapq.heappop(arr))
        else:
            print(0)

    else:
        heapq.heappush(arr, x)

 

- heappush()로 자연수 x를 추가하고, heappop()으로 최소 힙에서 가장 작은 값을 출력하고 제거한다.

 

import heapq
import sys

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

for _ in range(n):
    x = int(sys.stdin.readline())

    if x == 0:
        if arr:
            print(-heapq.heappop(arr))
        else:
            print(0)

    else:
        heapq.heappush(arr, -x)

 

- 위에 풀이와 거의 유사하나 최대 힙처럼 활용하기 위해 음수(-x)로 추가하고 가장 큰 값을 출력하고 제거하기 위해 '-'를 추가하여 원래의 값으로 반환한다.