πŸ‘Š PS/Algorithm

[Baekjoon] 7662번: 이쀑 μš°μ„ μˆœμœ„ 큐

hades1 2024. 7. 17. 22:42

πŸ₯… 문제

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

 

πŸ” 섀계

μ²˜μŒμ— min_pq와 max_pqλ§Œμ„ λ§Œλ“€μ–΄μ„œ D일 λ•Œ n이 무엇이냐에 따라 ν•œμͺ½μœΌλ‘œ λͺ°μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” 방식을 νƒν–ˆλŠ”λ° μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν–ˆλ‹€. λ‹€λ₯Έ 방법을 μ°Ύμ•„μ•Ό ν•œλ‹€.

 

map을 μ΄μš©ν•˜μ—¬ 개수λ₯Ό μ €μž₯ν•˜κ³ , D일 λ•Œ, μ‚­μ œλ₯Ό ν•˜κΈ° μ „, λ‹€λ₯Έ λͺ…λ Ήμ—μ„œ κ°œμˆ˜κ°€ 0이 λ˜μ—ˆμ„ μˆ˜λ„ μžˆμœΌλ―€λ‘œ κ·Έ 경우λ₯Ό κ³ λ €ν•˜μ—¬ μ‚­μ œ 처리λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ D 1μ΄μ–΄μ„œ max_pqμ—μ„œλŠ” μ‚­μ œν–ˆμ§€λ§Œ, min_pqμ—μ„œλŠ” μ‚­μ œν•  수 μ—†μœΌλ―€λ‘œ λ°˜μ˜λ˜μ§€ μ•Šμ•˜λ‹€. 개수만 κ°μ†Œμ‹œν‚€κ³ , μ‚­μ œν•˜λ €λŠ” 수의 κ°œμˆ˜κ°€ 0일 λ•Œ, λͺ¨λ‘ μ‚­μ œν•œλ‹€.

 

πŸ‘Š 풀이

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

char ch;
int t, k, n;

int main(void)
{	
	cin >> t;
	for (int i = 0; i < t; i++) {
		cin >> k;
		priority_queue<int, vector<int>, greater<int>> min_pq;
		priority_queue<int> max_pq;
		map<int, int> save;
		for (int j = 0; j < k; j++) {
			cin >> ch >> n;
			if (ch == 'I') {
				min_pq.push(n);
				max_pq.push(n);
				if (save.count(n) == 0){
					save[n] = 1;
				}
				else{
					save[n] += 1;
				}
			}
			else {
				if (n == 1) {
					while (!max_pq.empty() && save[max_pq.top()] == 0){
						max_pq.pop();
					}
					if (!max_pq.empty()){
						save[max_pq.top()] -= 1;
						max_pq.pop();
					}
				}
				else {
					while (!min_pq.empty() && save[min_pq.top()] == 0){
						min_pq.pop();
					}
					if (!min_pq.empty()){
						save[min_pq.top()] -= 1;
						min_pq.pop();
					}
				}
			}
		}
		while (!max_pq.empty() && save[max_pq.top()] == 0){
			max_pq.pop();
		}
		while (!min_pq.empty() && save[min_pq.top()] == 0){
			min_pq.pop();
		}
		if (max_pq.empty() && min_pq.empty()){
			cout << "EMPTY" << "\n";
		}
		else{
			cout << max_pq.top() << " " << min_pq.top() << "\n";
		}
	}
	return 0;
}