[ 문제 ] : https://programmers.co.kr/learn/courses/30/lessons/42628
[ 문제 접근 ]
그렇게 어렵지만은 않았던 문제.
나는 입력으로 주어진 operations 를 stringstream 객체를 이용해서 split 해줬다.
※ 주의 할 점은 stringstream 객체 ss 를 그냥 ss.str( ~~ ) 하고 해준다면 스트림 이 비워지지 않기 때문에
ss.clear()를 먼저 해주고 ss.str(operation[i]) 를 해준다.
우선순위큐를 마치 덱처럼 앞뒤에서 연산이 가능하게끔 해야하는 문제인데,
실제로 그렇게 못하니깐 우선순위 큐를 두개를 두어 그렇게 연산되는 것처럼 만들었따.
입력으로 주어진 명령어를 읽을때마다 알맞은 큐에서 작업하게끔!
[ 최종 코드 ]
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
#include<sstream>
using namespace std;
vector<int> solution(vector<string> operations) {
vector<int> answer;
std::priority_queue<int> max_heap;
std::priority_queue<int,vector<int>,std::greater<int>> min_heap;
std::stringstream ss;
string order;
string number;
int cnt = 0;
for (size_t i = 0; i < operations.size(); i++) {
ss.clear();
ss.str(operations[i]);
ss >> order >> number;
if (cnt == 0) {
while (!min_heap.empty()) min_heap.pop();
while (!max_heap.empty()) max_heap.pop();
}
if (order == "I") {
max_heap.push(std::stoi(number));
min_heap.push(std::stoi(number));
cnt++;
}
else {
if (cnt == 0) {
continue;
}
if (stoi(number) > 0) {
max_heap.pop();
cnt--;
}
else {
min_heap.pop();
cnt--;
}
}
}
if (!cnt) {
answer.push_back(0);
answer.push_back(0);
}
else {
int max = max_heap.top();
int min = min_heap.top();
answer.push_back(max);
answer.push_back(min);
}
return answer;
}
[ Key Point ]
👉 opeartions 명령어에 따라 원소를 삭제하는 큐가 정해지기 때문에 큐를 전부 비워야함에도 남아 있는 원소가 있을 수 있다. 이 때, cnt 변수를 통해 큐 원소 개수를 추적하고 0이 될때 모든 큐를 비워준다.
if (cnt == 0) { // 어느 한 큐가 비었으면 모두 비우게끔.
while (!min_heap.empty()) min_heap.pop();
while (!max_heap.empty()) max_heap.pop();
}
[ 다른 사람 풀이 ]
'PS > Programmers' 카테고리의 다른 글
[모의고사] - 완전탐색 ★☆☆☆ / 복습 ○ (0) | 2021.12.26 |
---|---|
[가장 큰 수] - 정렬 ★★☆☆ / 복습 ○ (0) | 2021.12.22 |
[디스크 컨트롤러] - 힙(heap) ★★★☆ / 복습 ○ (0) | 2021.12.20 |
[더 맵게] - 힙(heap) ★★☆☆ / 복습 ○ (0) | 2021.12.20 |
[기능개발] - 스택/큐 ★☆☆☆ / 복습 ○ (0) | 2021.12.20 |