https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
우선순위 큐에 관련된 간단한 예제이다. 입력되는 인덱스들의 절댓값이 더 작은 원소들을 출력하고, 절댓값이 같다면 실제 인덱스 값이 더 작은 (쉽게 말해 양수와 음수중 음수를 출력) 값을 출력하면 된다.
이 매커니즘을 구현하려면 먼저 우선순위 큐 라는 자료구조를 알고 있어야 한다. 우선순위 큐에 대한 내용은 다음 게시글에서 자세하게 작성해 놓았다.
https://jhoon-study.tistory.com/75
[C++] STL priority_queue 사용법
priority queue C++ STL 컨테이너 중 하나로, 내부적으로 힙 자료구조로 구현된 우선순위 큐를 보다 편하게 사용할 수 있게 해준다. 기존의 스택이나 큐 같은 자료구조의 경우, 먼저 들어왔는지 나중에
jhoon-study.tistory.com
이 문제에서 키 포인트는, 절댓값이 같은 원소들에 대해 음수를 먼저 출력해야 한다는 것인데, 그냥 우선순위 큐에 저장할때에 절댓값과 실제 인덱스를 pair형으로 같이 저장하는 방법으로 해결하였다. 따라서, 우선순위 큐를 선언하는 구문은 다음과 같다.
우선순위 큐의 기본 설정인 내림차순 정렬 또한 바꿔주고자 greater<pair<int,int>>도 같이 달아주었다.
#include <iostream>
#include <queue>
using namespace std;
int main() {
int N;
cin >> N;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
while (N-->0) {
int a;
cin >> a;
if (a==0) {
if (pq.empty()) cout << 0 << '\n';
else {
cout << pq.top().second << '\n';
pq.pop();
}
}
else {
pq.push(make_pair(abs(a), a));
}
}
return 0;
}

'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] #8979 올림픽 (0) | 2024.02.16 |
---|---|
[BOJ] #4963 섬의 개수 (0) | 2024.02.15 |
[BOJ] #1238 파티 (0) | 2024.02.08 |
[BOJ] #1916 최소비용 구하기 (0) | 2024.02.08 |
[BOJ] #2583 영역 구하기 (0) | 2024.02.04 |