득이공간
[백준 C++] 7662 이중 우선순위 큐 - 우선순위큐 본문
7662번: 이중 우선순위 큐
입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적
www.acmicpc.net
#include <iostream>
#include <unordered_map>
#include <queue>
using namespace std;
unordered_map<int, int> CheckNum;
priority_queue<int> MaxHeap;
priority_queue<int, vector<int>, greater<int>> MinHeap;
void Input(int Number)
{
++CheckNum[Number];
MaxHeap.emplace(Number);
MinHeap.emplace(Number);
}
void DeleteMax()
{
if (!MaxHeap.empty())
{
int Number = MaxHeap.top();
MaxHeap.pop();
--CheckNum[Number];
}
}
void DeleteMin()
{
if (!MinHeap.empty())
{
int Number = MinHeap.top();
MinHeap.pop();
--CheckNum[Number];
}
}
void CleanHeap()
{
while (!MaxHeap.empty()
&& CheckNum[MaxHeap.top()] == 0)
{
MaxHeap.pop();
}
while (!MinHeap.empty()
&& CheckNum[MinHeap.top()] == 0)
{
MinHeap.pop();
}
}
void Test()
{
CheckNum.clear();
while (!MaxHeap.empty())
{
MaxHeap.pop();
}
while (!MinHeap.empty())
{
MinHeap.pop();
}
int K;
cin >> K;
for (int i = 0; i < K; ++i)
{
char Command;
int Number;
cin >> Command >> Number;
if (Command == 'I')
{
Input(Number);
}
else if (Command == 'D' && Number == 1)
{
DeleteMax();
CleanHeap();
}
else if (Command == 'D' && Number == -1)
{
DeleteMin();
CleanHeap();
}
}
if (MaxHeap.empty() || MinHeap.empty())
{
cout << "EMPTY\n";
return;
}
cout << MaxHeap.top() << ' ' << MinHeap.top() << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int T;
cin >> T;
for (int i = 0; i < T; ++i)
{
Test();
}
}
우선순위 큐 두 개와 해시 맵 한 개를 이용해서 풀었습니다.
주어진 입력에 따라서 MaxHeap과 MinHeap으로 pop 연산을 따로 수행하도록 하고
unordered_map에 각 숫자 데이터가 몇 개 남아있는지를 저장하도록 했습니다.
삭제 연산을 수행하고나면 해시맵에 남아있는 데이터를 파악해서 양쪽 힙의 데이터를 정리하도록 하는 부분이 중요했습니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 C++] 10026 적록색약 - 깊이우선탐색 (0) | 2024.02.18 |
---|---|
[백준 C++] 9019 DSLR - 너비우선탐색 (0) | 2024.02.18 |
[백준 C++] 7569 토마토 - 너비우선탐색 (0) | 2024.02.17 |
[백준 C++] 5430 AC - 덱 (0) | 2024.02.17 |
[백준 C++] 1107 리모컨 - 브루트포스 (0) | 2024.02.17 |