리뷰
최소값 삭제와 최대값 삭제를 위해 매번 큐의 정렬을 다시 할 수 는 없다. 그래서 우선순위큐 2개를 뒀다.
우선순위큐의 기본 정렬은 less라서 오름차순이다.
오름차순 정렬하는 최소값 큐 min_pq
내림차순 정렬하는 최대값 큐 max_pq
큐 사이즈를 관리하는 변수가 0이 되면, 큐 2개 다 비워줘야하는데! 이 부분을 빠뜨려서 다른 분 코드를 참고했다.
1. priority_queue 2개 사용한 코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, greater<>> min_pq;
priority_queue<int, vector<int>, less<>> max_pq;
int pq_size; // 큐의 사이즈 관리
vector<int> solution(vector<string> op) {
vector<int> answer = {0, 0};
for(auto s : op){
string order = s.substr(0, 1); // 명령 문자 I 또는 D
int num = stoi(s.substr(2, s.size())); // 숫자부분
if(order == "I") {
min_pq.push(num);
max_pq.push(num);
pq_size++;
}
else if(pq_size > 0 && order == "D"){
(num == -1) ? min_pq.pop() : max_pq.pop();
pq_size--;
if(pq_size == 0){
while(!min_pq.empty()) min_pq.pop();
while(!max_pq.empty()) max_pq.pop();
}
}
}
if(!min_pq.empty() && !max_pq.empty()) answer = {max_pq.top(), min_pq.top()};
return answer;
}
풀고 나니깐 다른 분들 코드에 set이 보이길래 multiset으로 풀어도 됬겠다 싶었다.
2. vector 로 푼 코드
앞, 뒤에서 하나씩 erase로 지워주기만 하면 되니까. vector로도 괜찮다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> op) {
vector<int> answer = {0,0};
vector<int> v;
for(auto s : op){
string order = s.substr(0, 1); // 명령
int num = stoi(s.substr(2)); // 숫자
if(order == "I") {
v.push_back(num);
sort(v.begin(), v.end(), greater<>()); // 푸시하고 바로 정렬.
}
else {
if(v.size() == 0) continue;
(num == -1) ? v.erase(v.end()-1) : v.erase(v.begin());
}
}
if(!v.empty()) {
answer.clear();
answer = {v[0], v[v.size()-1]};
}
return answer;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] n^2배열자르기 (0) | 2022.05.19 |
---|---|
[프로그래머스] 입국심사 c++ (0) | 2022.05.10 |
[프로그래머스] 정수삼각형 c++ (0) | 2022.05.04 |
[프로그래머스] 등굣길 c++ (0) | 2022.05.04 |
[프로그래머스] N으로 표현 c++ DFS코드 (0) | 2022.04.13 |