배움 저장소

[프로그래머스] 이중우선순위큐 C++ 본문

PS/프로그래머스

[프로그래머스] 이중우선순위큐 C++

시옷지읏 2021. 4. 10. 21:57

programmers.co.kr/learn/courses/30/lessons/42628

 

코딩테스트 연습 - 이중우선순위큐

 

programmers.co.kr

priority queue 2개로 풀어도 되지만 make_heap을 사용하면 하나로 풀 수 있다.

비교 연산자 역할을 하는 smaller와 bigger는 lambda로 대신해도 된다. 다만 자주 사용하기 때문에 비효율적이다.

extractMax 와 extractMin을 함수를 둘 다 만들지 않고 함수 포인터를 parameter로 넘겨 코드 수를 줄일 수 있었다.

bool smaller(int a, int b){ return a>b; }
bool bigger(int a, int b){ return a<b; }

int extract(vector<int>& v, bool(*compare)(int,int)){
    make_heap(v.begin(),v.end(),compare);
    pop_heap(v.begin(), v.end(),compare);
    int temp = v.back();
    v.pop_back();
    return temp;
}

vector<int> solution(vector<string> operations) {
    vector<int> v;
    for(string s:operations){
        int temp = stoi(s.substr(2));
        if(s[0]=='I'){ v.push_back(temp); } 
        else if(s[0]=='D' && !v.empty()){

            if(temp == 1 ){ extract(v,bigger); } 
            else if( temp == -1 ) { extract(v,smaller); }
        }
    }
    vector<int> answer;
    if(!v.empty()){ answer.push_back(extract(v,bigger)); } 
    else { answer.push_back(0); }
    if(!v.empty()){ answer.push_back(extract(v,smaller)); } 
    else { answer.push_back(0); }

    return answer;
}​
Comments