문제 풀이
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> operations) {
vector<int> answer;
// 자동 정렬을 위한 우선순위 큐 생성. 우선순위 큐는 "내림차순"으로 정렬된다!
priority_queue<int> pq;
// operations를 돌면서
for (int i = 0; i < operations.size(); i++) {
// 명렁어가 I 숫자라면
if (operations[i][0] == 'I') {
// 공백 이후 숫자부분(substr(2))을 숫자로 바꾸어(stoi) 우선순위 큐에 저장
pq.push(stoi(operations[i].substr(2)));
}
// 우선순위 큐에 값이 존재하는 경우
if (!pq.empty()) {
// "D 1"은 최댓값 삭제 명령어이고 우선순위 큐는 내림차순이라 가장 앞이 최댓값이다.
// 때문에 그냥 pop을 해주면 끝.
if (operations[i] == "D 1") {
pq.pop();
}
// "D -1"은 최솟값 삭제 명령어이다. 때문에 우선순위 큐를 오름차순으로 바꿔줄 필요가 있다.
else if (operations[i] == "D -1") {
// 오름차순 우선순위 큐를 생성.
priority_queue<int, vector<int>, greater<int>> g_pq;
// 오름차순 큐에 원래 큐를 다 넣어준다.
while (!pq.empty()) {
g_pq.push(pq.top());
pq.pop();
}
// 오름차순이 되어 가장 앞이 최솟값이 되었다. 이제 최솟값을 pop한 후
g_pq.pop();
// 다시 내림차순 큐에 집어넣어주도록 한다.
while (!g_pq.empty()) {
pq.push(g_pq.top());
g_pq.pop();
}
}
}
}
// pq 에 값이 존재한다면
if (!pq.empty()) {
// 최대, 최솟값을 찾기 위한 임시배열 생성
vector<int> tmp;
// pq의 값을 tmp에 이전한 후
while (!pq.empty()) {
tmp.push_back(pq.top());
pq.pop();
}
// 최대, 최솟값을 찾아 answer에 [최대, 최소]의 순으로 넣어준다.
// *max(min)_element(배열.begin(), 배열.end()); 은 해당 배열에서 최대, 최소값을 찾아주는 기능을 한다. <algorithm> 헤더에 있다.
int maxval, minval;
maxval = *max_element(tmp.begin(), tmp.end());
minval = *min_element(tmp.begin(), tmp.end());
answer.push_back(maxval);
answer.push_back(minval);
}
// pq가 비어있다면 [0, 0]을 만들어준다.
else {
answer.push_back(0);
answer.push_back(0);
}
return answer;
}
문제 링크
programmers.co.kr/learn/courses/30/lessons/42628?language=cpp
'C++ > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 가장 큰 수 (0) | 2020.12.07 |
---|---|
[프로그래머스] [C++] K번째 수 (0) | 2020.12.03 |
[프로그래머스] [C++] 디스크 컨트롤러 (0) | 2020.12.02 |
[프로그래머스] [C++] 더 맵게 (0) | 2020.11.29 |
[프로그래머스] [C++] 프린터 (0) | 2020.11.27 |