BOJ 11286 - 절댓값 힙 문제풀이
문제를 읽고 이해하기
절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.
- 배열에 정수 x (x ≠ 0)를 넣는다.
- 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 절댓값이 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 정수는 -231보다 크고, 231보다 작다.
입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 절댓값이 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.
재정의와 추상화
절댓값이 '작은' 순서대로 출력한다는 점에 착안하여 우선순위 큐를 이용하여 문제를 풀 것이다.
우선순위 큐를 선언을 priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;로 했다. pair의 first는 절댓값을 넣고 second는 실제 값을 넣는다.
그리고 cmp를 통해 절댓값이 '작은' 순서대로, 만약 절댓값이 같을 경우, 실제 값이 더 작은 것(음수)을 우선으로 정렬되게 하였다.
이 외에는 문제에서 말한대로 구현하였다.
코드 작성
#include <iostream>
#include <utility>
#include <queue>
#include <cmath>
using namespace std;
class cmp {
public:
bool operator()(pair<int, int> a, pair<int, int> b) {
if (a.first == b.first)
return a.second > b.second;
return a.first > b.first;
}
};
int main() {
cin.sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;
int n;
cin >> n;
while (n--) {
int x;
cin >> x;
if (x == 0) {
if (pq.empty()) {
cout << 0 << '\n';
continue;
}
cout << pq.top().second << '\n';
pq.pop();
} else
pq.push(make_pair(abs(x), x));
}
return 0;
}
회고하기
C++ STL의 우선순위 큐만 이용할 줄 알면 별로 어려울 것이 없는 문제였다. 다만, priority_queue의 <> 내부의 3번째에 전달되는 cmp를 사용하는 것은 처음이었기 때문에 서핑을 통해 알아낼 수 밖에 없었다.
이 곳을 참고하여 복습하도록 하자!
'알고리즘 > 문제풀이' 카테고리의 다른 글
BOJ 1427 - 소트인사이드 문제풀이 (0) | 2020.03.25 |
---|---|
BOJ 1181 - 단어 정렬 문제풀이 (0) | 2020.03.25 |
BOJ 1026 - 보물 문제풀이 (0) | 2020.03.25 |
BOJ 1010 - 다리 놓기 문제풀이 (0) | 2020.03.19 |
BOJ 2630 - 색종이 만들기 문제풀이 (0) | 2020.03.18 |
댓글
이 글 공유하기
다른 글
-
BOJ 1181 - 단어 정렬 문제풀이
BOJ 1181 - 단어 정렬 문제풀이
2020.03.25 -
BOJ 1026 - 보물 문제풀이
BOJ 1026 - 보물 문제풀이
2020.03.25 -
BOJ 1010 - 다리 놓기 문제풀이
BOJ 1010 - 다리 놓기 문제풀이
2020.03.19 -
BOJ 2630 - 색종이 만들기 문제풀이
BOJ 2630 - 색종이 만들기 문제풀이
2020.03.18