강의로 돌아가기
황윤선

priority queue(STL) 사용한 풀이(c++)

내림차순 정렬되는 priority queue를 사용할 경우, 최댓값 삭제는 루프를 돌면서 바로바로 해주고,
최솟값 삭제는 삭제 횟수를 누적한 후 마지막에 삭제횟수와 priority queue에 남은 숫자 개수를 비교하며 케이스를 나누어 생각하면 됩니다. 삭제횟수만큼 삭제한 후에도 숫자가 남을 경우, (삭제횟수+1)만큼 큐에 개수가 남을 때까지만 삭제를 해 주어서 최솟값을 찾고, 삭제횟수가 남은 큐의 개수보다 크거나 같을 경우 min과 max가 없는 빈 큐가 결과에 남을 것이라고 생각하면 됩니다.

작성중인 코드―solution.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#include <iostream>

using namespace std;

vector<int> solution(vector<string> operations) {
    vector<int> answer;
    priority_queue <int> pq;
    int min_delete = 0;
    for(int i=0; i<operations.size(); i++)
    {
        string op = operations[i];
        //1. 삽입
        if(op[0]=='I')
        {
            string numstr = op.substr(2);
            int num = stoi(numstr);
            pq.push(num);
        }
        //2.삭제
        else
        {
            //만약 큐가 비어있다면 연산 무시
            if(pq.size()==0) continue;
            else
            {
                //최솟값 삭제(lazy delete, 나중에 삭제횟수 모아서 한번에 삭제)
                if(op[2]=='-') min_delete++;
                //최댓값 삭제
                else pq.pop();
            }
        }
    }
    //lazy delete & 답 만들기
    int max = 0; int min = 0;
    //max 구하기
    if(pq.size()>0) max = pq.top();
    //min구하기
    //최솟값 삭제연산 호출 횟수가 남아있는 pq 사이즈로 감당되는 경우
    if(pq.size()>=min_delete+1)
        while(pq.size()>min_delete+1) pq.pop();
    //최솟값 삭제연산 호출횟수가 남은 pq의 숫자보다 넘칠경우
    else
        while(pq.size()>0) pq.pop();

    if(pq.empty()==true)
    {
        max = 0; 
        min = 0;
    }
    else
        min = pq.top();
    answer.emplace_back(max);
    answer.emplace_back(min);
    return answer;
}
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.