GitHubSeob
C++ / 백준 / 7662 / 이중 우선순위 큐 본문
문제
https://www.acmicpc.net/problem/7662
7662번: 이중 우선순위 큐
입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적
www.acmicpc.net
문제풀이
map을 이용해서 풀었다.
I 숫자는 입력이므로 cin >> oper >> n을 통해 I와 값을 입력받고 map인 m을 선언하였으므로 m[n]의 값을 1 증가시킨다.
연산이 D 1일 경우 최댓값을 삭제해야 한다.
그래서 iterator인 iter을 선언하고 m의 end부분으로 간 뒤 한 칸 앞으로 이동(--m.end())한다.
동일한 값을 입력받을 수 있으므로 최댓값이 몇 개 입력됐는지 확인을 한다.
여러 개가 입력되었을 경우는 iter을 통해 m[n]값인 iter->second를 1 줄인다.
해당 값이 한 번만 입력되었을 경우는 erase를 통해 지운다.
while문이 종료되면 m이 비었을 경우는 EMPTY를, 그 외의 경우는 최댓값, 최솟값을 출력한다.
코드
#include <iostream>
#include <map>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T(0), k(0), n(0);
char oper(' ');
cin >> T;
while (T--) {
cin >> k;
map<int, int>m;
map<int, int>::iterator iter;
while (k--) {
cin >> oper >> n;
if (oper == 'I') {
m[n]++;
}
else {
if (!m.empty()) {
if (n == 1) {
iter = --m.end();
if (iter->second == 1)
m.erase(iter);
else iter->second--;
}
else {
iter = m.begin();
if (iter->second == 1)
m.erase(iter);
else iter->second--;
}
}
}
}
if (m.empty()) cout << "EMPTY\n";
else {
cout << (--m.end())->first << " ";
cout << m.begin()->first << '\n';
}
}
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 21939 / 문제 추첨 시스템 Version 1 (0) | 2022.04.07 |
---|---|
C++ / 백준 / 2075 / N번째 큰 수 (0) | 2022.03.30 |
C++ / 백준 / 1918 / 후위 표기식 (0) | 2022.03.21 |
C++ / 백준 / 2493 / 탑 (0) | 2022.03.18 |
C++ / 백준 / 2800 / 괄호 제거 (0) | 2022.03.14 |