오늘의 알고리즘
[C++] 백준 7662 이중 우선순위 큐
하늘하늘 .
2022. 9. 6. 02:06
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <unordered_map>
int main()
{
int N = 0;
std::cin >> N;
for (int i = 0; i < N; ++i)
{
int T = 0;
std::cin >> T;
std::unordered_map<int, int> map = {};
std::priority_queue<int> maxQue = {};
std::priority_queue<int,
std::vector<int>,
std::greater<int>> minQue = {};
for (int j = 0; j < T; ++j)
{
char c = {};
int iNumber = 0;
std::cin >> c >> iNumber;
if (c == 'I')
{
maxQue.push(iNumber);
minQue.push(iNumber);
++map[iNumber];
}
else if (c == 'D')
{
if (iNumber == 1)
{
while (!maxQue.empty() && !map[maxQue.top()])
{
maxQue.pop();
}
if (!maxQue.empty() && map[maxQue.top()])
{
--map[maxQue.top()];
maxQue.pop();
}
}
else
{
while (!minQue.empty() && !map[minQue.top()])
{
minQue.pop();
}
if (!minQue.empty() && map[minQue.top()])
{
--map[minQue.top()];
minQue.pop();
}
}
}
}
while (!minQue.empty() && !map[minQue.top()])
{
minQue.pop();
}
while (!maxQue.empty() && !map[maxQue.top()])
{
maxQue.pop();
}
if (maxQue.empty() || minQue.empty())
std::cout << "EMPTY\n";
else
std::cout << maxQue.top() << " " << minQue.top() << "\n";
}
return 0;
}
이중우선순위큐인건 이름부터 봐서 알았습니다.
근데 뺄 때 좀 어려웠습니다.
maxQue나 minQue라던 것을 맨 위만 빼게 되면 max가 들어간 min큐, min이 들어간 max큐가 문제가 됩니다.
그래서 생각한 게 어떤 한쪽이 있는 지 없는지 확인하는 것입니다.
unordered_map을 이용해서 접근성을 높였습니다.