Do Something

[프로그래머스][c++][힙(heap)] 이중우선순위큐 (vector) 본문

프로그래머스

[프로그래머스][c++][힙(heap)] 이중우선순위큐 (vector)

뭐라도해야겠다 2022. 1. 28. 04:44
  • 이중우선순위큐
문제 설명

이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.

명령어수신 탑(높이)
I 숫자 큐에 주어진 숫자를 삽입합니다.
D 1 큐에서 최댓값을 삭제합니다.
D -1 큐에서 최솟값을 삭제합니다.

이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.

제한사항
  • operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
  • operations의 원소는 큐가 수행할 연산을 나타냅니다.
    • 원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
  • 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.
입출력 예operationsreturn
["I 16","D 1"] [0,0]
["I 7","I 5","I -5","D -1"] [7,5]
입출력 예 설명

16을 삽입 후 최댓값을 삭제합니다. 비어있으므로 [0,0]을 반환합니다.
7,5,-5를 삽입 후 최솟값을 삭제합니다. 최대값 7, 최소값 5를 반환합니다.

출처


 

 

 

문제를 풀었는데 이게 맞다 싶다.

너무 어거지로푼거같아서 다른사람들 답을 봐도 비슷비슷해보인다.

뭐지...

 

 

이렇게하면 시간이 뻑나지 않을까 걱정했는데 그렇게 타이트하지는 않은 것 같다. 

vector를 선언해서 그냥 insert할때마다 정렬해주는 아주 간단하면서도 미친 방법을 사용했다.

최대값 최솟값은 최대한 계산을 줄이기 위해서 최솟값일때는 [0]을 int의 대충 큰값으로 해두었고, 

최댓값은 그냥 pop_back했다.

 

이게 맞나 싶다 풀어도

거참...

priority_queue두개만들어서 지지고 볶고 하다가 이건 정말 아닌거같아서 미친척하고 제출한건데 되니까 황당하다.

 

 

++multiset이라는거도 있구나

https://blockdmask.tistory.com/80

이거좀 봐봐야겠다.

 

[C++] multiset container 정리 및 사용법

안녕하세요 ! BlockDMask 입니다. 오늘은, 연관 컨테이너(set, multiset, map, multimap)중 multiset 에 대해서 알아보겠습니다.! set과 구별되는 multiset의 가장 큰 특징은 key값이 중복된다는 것 입니다. 나머..

blockdmask.tistory.com

#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

vector<int> solution(vector<string> operations) {
    vector<int> answer;
    vector<int> task;
    char sw;
    int tmp,start = 0;
    for(auto K:operations){
        sw = K[0];
        tmp = stoi(K.substr(2));
        if(K[0] == 'I') {
            task.push_back(tmp);
            sort(task.begin(),task.end());
            for(int i=0;i<start;i++){task.pop_back();}
            start = 0;
        }
        else{
            if(K[2] == '1'){if(!task.empty()) task.pop_back();}
            else{
                if(task.size()>start){
                    task[start] = 210000000;
                    start++;
                }
            }
        }
    }
    if(task.empty()){
        return {0,0};
    }
    sort(task.begin(),task.end());
    for(int i=0;i<start;i++){task.pop_back();}
    return {task.back(),task[0]};
}