https://www.acmicpc.net/problem/7662
7662번: 이중 우선순위 큐
입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적
www.acmicpc.net
우선순위 덱은 왜 없는지 모르겠다...
문제를 요약하자면 삽입연산, 최솟값 삭제 연산, 최댓값 삭제 연산등 총 3가지 연산이 있는데, 이 들의 연산이 끝난 후 남아있는 최댓값과 최솟값을 구하는 문제이다.
여러모로 탈탈 털렸으나 배울 점이 많은 것 같다.
생각해야 할 점:
1.
우선 입력 받은 수가 존재하는 지, 몇개가 존재하는 지에 대해 알아야하므로 map을 이용해 삽입, 삭제 연산이 일어날 때마다 map 내의 정보들을 갱신해줘야한다.
2.
최대 값과 최솟 값을 뽑아내기 위해 최소 힙과 최대 힙 2가지를 이용한다.
3
삭제가 일어날 때마다, 반대 힙의 숫자도 뺄수 있으면 빼야한다.
3번 이게 무슨 말이냐면, 만약 -10과 10각각 두 힙에 존재 할 때, 최소 삭제와 최대 삭제를 각각 이행 하면 원래대로라면,
최소힙에는 10이 남아있고, 최대 힙에는 -10이 남게 되는데, 여기서 삽입 연산으로 20이 한번 더 일어나면 각각 힙은 10과 20을 가리키게된다.
이런 연산이 반복되다 보면 삭제되어야 할수와 새로 삽입된 수가 층층이 겹을 이뤄 최소, 최대 연산이 제대로 안될수 있다
4
각 테스트 케이스마다 힙들과 map을 초기화해야한다.
다음은 정답 코드이다.
<정답>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
priority_queue <int, vector<int>, greater<int> > minQ; // 최소
priority_queue<int, vector<int>, less<int>> maxQ;
map<int, int> cnt;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--) {
// 큐 비우기
while (!maxQ.empty()) {
maxQ.pop();
}
while (!minQ.empty() ) {
minQ.pop();
}
cnt.clear();
int K;
cin >> K;
while (K--) {
char op;
int data;
cin >> op >> data; // 시작
if ( op == 'D') {
if (maxQ.empty() || minQ.empty()) { // 큐 내부 갯수가 없으면
//cout << "EMPTY" << "\n";
//isEmpty = true;
continue;
}
else if (!maxQ.empty() && data == 1) {
// cout << "max top: " << maxQ.top() << "\n";
cnt[maxQ.top()]--;
maxQ.pop();
// cout << "최대 큐 삭제, cnt: " << cnt << "\n";
}
else if (!minQ.empty()&&data == -1) { // data ==-1
// 최소 삭제
// cout << "min top: " << minQ.top() << "\n";
cnt[minQ.top()]--;
minQ.pop();
// cout << "최소 큐 삭제, cnt: " << cnt << "\n";
}
while (!maxQ.empty() && cnt[maxQ.top()] == 0) {
maxQ.pop();
}
while (!minQ.empty() && cnt[minQ.top()] == 0) {
minQ.pop();
}
}// delete 연산
else if (op == 'I') {
maxQ.push(data);
minQ.push(data);
cnt[data]++;
} // insert 연산
} // k
while (!maxQ.empty() && cnt[maxQ.top()] == 0) {
maxQ.pop();
}
while (!minQ.empty() && cnt[minQ.top()] == 0) {
minQ.pop();
}
if (maxQ.empty() || minQ.empty() ) {
cout << "EMPTY" << "\n";
}
else cout << maxQ.top() << " " << minQ.top() << "\n";
}// test case
return 0;
}
'알고리즘(PS)' 카테고리의 다른 글
백준[boj 1654번: 랜선 자르기] -c++ (0) | 2024.02.13 |
---|---|
오답 노트 (1) | 2024.02.13 |
백준[boj 13549번: 숨바꼭질2 ] (1) | 2024.02.12 |
백준[boj 2468번: 안전 영역 ] (0) | 2024.02.12 |
백준[boj 1806번: 부분합] (1) | 2024.02.08 |