https://www.acmicpc.net/problem/1927
1927번: 최소 힙
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
풀이 과정
최소 힙을 이용하여 문제에서 주어진 연산을 지원하는 프로그램을 작성하면 된다.
힙은 이진트리의 일종이므로 일차원 배열로 직접 구현이 가능하나, 라이브러리에 구현되어 있는 힙을 사용하였다.
C++의 경우에는 기본이 최대 힙이고, 파이썬은 기본이 최소 힙이다.
priority_queue<int> max_heap; // 최대 힙
priority_queue<int, vector<int>, greater<int>> min_heap; // 최소 힙
import heapq
heap = []
heapq.heappush(3)
heapq.heappush(5) # 기본은 최소힙
max_heap = []
heapq.heappush((-3, 3))
heapq.heappush((-5, 5)) # 이런 테크닉을 이용하여 최소힙을 최대힙처럼 사용해야 한다
소스 코드
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
priority_queue<int, vector<int>, greater<int>> pq;
int N, num;
cin >> N;
while (N--) {
cin >> num;
if (num == 0) {
if (pq.empty()) {
cout << 0 << '\n';
} else {
cout << pq.top() << '\n';
pq.pop();
}
} else {
pq.push(num);
}
}
return 0;
}
Python
import heapq
import sys
heap = []
N = int(sys.stdin.readline())
for i in range(N):
x = int(sys.stdin.readline())
if x == 0:
if not heap:
print(0)
else:
print(heapq.heappop(heap))
continue
heapq.heappush(heap, x)
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1103 - 게임 [C++] (0) | 2022.07.09 |
---|---|
백준 3425 - 고스택 [C++] (0) | 2022.07.09 |
백준 2748 - 피보나치 수 2 [C++] (0) | 2022.07.05 |
백준 2805 - 나무 자르기 [C++] (0) | 2022.07.05 |
백준 2003 - 수들의 합 2 [C++] (0) | 2022.07.05 |