개발/백준

[백준] 7662번. 이중 우선순위 큐 (C++)

yun000 2024. 12. 28. 00:26

문제

https://www.acmicpc.net/problem/7662

 

풀이

[priority queue]

INSERT

최대힙, 최소힙에 둘 다 숫자를 넣는다

desc.push(n);
asc.push(n);

number에 해당 수가 몇개 있는지 저장한다

number[n]++;

 

DELETE

숫자를 저장하는 곳이 2개(desc,asc)라서 확인해야 하는 과정이 있다.

 

확인하려는 최소값(asc.top()) 혹은 최대값(desc.top())이 존재하는 값인지 확인해야 한다.

만약 number에서 확인한 값이 0이면 number[desc.top()] == 0  

이미 삭제된 값이라 존재하지 않는다는 의미이다. 

그렇기에 해당 값을 최소힙 혹은 최대힙에서 pop(asc.pop();, desc.pop())한다.

while (!asc.empty() && number[asc.top()] == 0)
    asc.pop();

최소 혹은 최대값을 삭제

number[asc.top()]--;
asc.pop();

 

 

코드

#include<iostream>
#include<queue>
#include<map>
using namespace std;

int main()
{
	//FAST INPUT,OUTPUT
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int T; cin >> T;
	for (int i = 0; i < T; i++)
	{
		//INPUT
		map<long, int>number;
		priority_queue<long, vector<long>>desc;
		priority_queue<long, vector<long>,greater<long>>asc;
		int K; cin >> K;

		//CHECK
		for (int k = 0; k < K; k++)
		{
			char cmd; cin >> cmd;
			long n;

			//DELETE
			if (cmd == 'D')
			{
				cin >> n;
				if (desc.empty() || asc.empty()) continue;

				// 최대값 삭제
				if (n == 1) {
					while (!desc.empty() && number[desc.top()] == 0)
						desc.pop();
					if (!desc.empty()) {
						number[desc.top()]--;
						desc.pop();
					}
				}
				// 최소값 삭제
				else if (n == -1) {
					while (!asc.empty() && number[asc.top()] == 0)
						asc.pop();
					if (!asc.empty()) {
						number[asc.top()]--;
						asc.pop();
					}
				}
			}
			//INSERT
			else if (cmd == 'I')
			{
				//n을 삽입
				cin >> n;
				desc.push(n);
				asc.push(n);
				number[n]++;
			}
		}

		while (!desc.empty() && number[desc.top()] == 0)
			desc.pop();
		while (!asc.empty() && number[asc.top()] == 0)
			asc.pop();

		if (desc.empty() || asc.empty()) { cout << "EMPTY\n"; }
		else { cout<< desc.top() << " " << asc.top() << "\n"; }
	}
}