오늘의 알고리즘

[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을 이용해서 접근성을 높였습니다.