BOJ 7662번
우선순위가 가장 큰 데이터와 가장 작은 데이터를 모두 삭제할 수 있는 기능을 가진 이중 우선순위 큐를 구현하시오.
풀이 알고리즘 : STL-MAP (트리)
입력이 들어오면, 해당 데이터의 우선순위(크기)에 따라서 위치를 조정해줘야 하므로,배열을 이용하여 입력때마다 정렬을 하거나 하는 방법은 시간초과가 날 수 있다.
그래서 STL의 MAP 컨테이너를 사용할 것이다.
MAP은 key와 value로 구성되어, key값을 통해 value로 빠르게 접근할 수 있는 컨테이너이다.
그런데 왜 사용하냐면, MAP은 입력받을 때 마다, 해당 데이터를 적절한 위치에 위치시키기 때문에 항상 정렬이 되어있다.즉 Map.begin()이 가장 작은 값이고, 그대로 순회를 하면 오름차순으로 값이 커지게 된다.
그래서 map<int, int>를 선언하고, key값을 데이터의 값, value값을 해당 데이터의 개수로 정의하여 선언하였다.
그래서 MAP 내부에 입력받은 데이터가 존재하지 않으면 (data, 1)을 입력하고, 존재한다면 개수를 1 증가시키는 방법을 사용하였다.
아래는 제출코드이다.
더보기
#include <bits/stdc++.h>
// 2의 제곱수 판정
#define POW2(X) (X) == ((X)&(-(X)))
// int pair 간단히
#define pii pair<int, int>
#define mp(X, Y) make_pair(X, Y)
// 기본설정
typedef long long ll;
using namespace std;
int dirx[4] = {1, 0, -1, 0};
int diry[4] = {0, 1, 0, -1};
int main(void) {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int tc;
cin >> tc;
while(tc--) {
map<int, int> checker;
int n, qsize = 0;
cin >> n;
while(n--) {
char order;
int data;
cin >> order >> data;
if(order == 'I') {
map<int, int>::iterator it = checker.find(data);
if(it != checker.end()) {
(*it).second++;
} else {
checker.insert(mp(data, 1));
}
qsize++;
} else {
if(qsize == 0) continue;
else if(data == -1) {
map<int, int>::iterator it = checker.begin();
if(it->second == 1) {
checker.erase(it->first);
} else {
(*it).second--;
}
} else {
map<int, int>::reverse_iterator it = checker.rbegin();
if(it->second == 1) {
checker.erase(it->first);
} else {
(*it).second--;
}
}
qsize--;
}
}
if(qsize) {
cout << checker.rbegin()->first << " " << checker.begin()->first << "\n";
} else {
cout << "EMPTY\n";
}
}
return 0;
}
'백준_BOJ > BOJ (골드)' 카테고리의 다른 글
[백준/알고리즘] 1916번 최소비용 구하기 (골드 5) (0) | 2020.07.30 |
---|---|
[백준/알고리즘] 1918번 후위 표기식 (골드 4) (0) | 2020.07.30 |
[백준/알고리즘] 1967번 트리의 지름 (골드 3) (0) | 2020.07.30 |
[백준/알고리즘] 14003번 가장 긴 증가하는 부분수열 5 (골드 1) (0) | 2020.07.01 |
[백준/알고리즘] 12738번 가장 긴 증가하는 부분 수열 3 (골드 2) (0) | 2020.06.30 |