알고리즘 문제/프로그래머스

이중우선순위큐 [Lv. 3]

우대비 2024. 7. 23. 15:54
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

이 문제는 주어진 문자열 명령어 리스트를 처리하여 최대값과 최소값을 동시에 관리하는 우선순위 큐를 구현하는 것입니다. 명령어는 'I x' 형식의 삽입과 'D 1' 또는 'D -1' 형식의 삭제로 구성됩니다.  

 

풀이 방법

이 문제는 min Heap, max Heap을 이용하여 푸는 문제입니다.

이 문제에서 어려움을 느낄 수 있는 부분은 둘 중 하나의 heap에서 수를 삭제 했을 때

다른 Heap에서도 해당 수를 삭제하는 것 일 것입니다.

 

저는 이 문제를 구조체를 이용해서 삭제된 수인지 체크하고

pop을 할 때 이미 삭제된 수라면 건너뛰는 방식으로 문제를 해결했습니다.

struct NODE
{
    bool isDeleted = false;
    int value;
};
else if (value == 1)
{   
    while (!maxQ.empty() && maxQ.top()->isDeleted)
        maxQ.pop();

    if (!maxQ.empty())
    {
        NODE* node = maxQ.top();
        node->isDeleted = true;
        maxQ.pop();
    }
}

 

정답 코드

- priority_queue

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <string>
#include <vector>
#include <iostream>
#include <memory>
 
using namespace std;
 
template<typename T>
struct priority_queue
{
    priority_queue(bool b = false) : isDescOrder(b){}
    
    void push(T value)
    {
        int idx = data.size();
        data.push_back(value);
 
        while (idx > 0)
        {
            int parent = (idx - 1/ 2;
            if (!CMP(data[idx], data[parent]))
            {
                break;                
            }
            swap(data[idx], data[parent]);
            
            idx = parent;
        }
      
    }
 
        void pop()
        {
            if (data.empty())
                    return;
 
            int idx = 0;
            data[idx] = data.back();
            data.pop_back();
 
            while (idx < data.size())
            {
                int left = (idx * 2+ 1;
                int right = left + 1;
 
                if (left >= data.size())
                        break;
 
                if (right < data.size() && CMP(data[right], data[left]))
                        left = right;
 
                if (!CMP(data[left], data[idx]))
                        break;
 
                swap(data[left], data[idx]);
                idx = left;
            }
        }
    
        bool CMP(const T& a, const T& b)
        {
            if (isDescOrder)
                return *> *b;                
            
            else
                return *< *b;                
        }
    
        T top()
        {
            return data.empty() == true ? nullptr : data[0];
        }
 
        bool empty()
        {
            return data.empty();
        }
    
        bool isDescOrder = false;
        vector<T> data;
};
cs

 

- solution

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
struct NODE
{
    bool isDeleted = false;
    int value;
 
    bool operator < (NODE other)
    {
        return value < other.value;
    }
 
    bool operator > (NODE other)
    {
        return value > other.value;
    }
 
    NODE(int v) : value(v) {};
};
 
vector<int> solution(vector<string> operations) {
    priority_queue<NODE*> minQ;
    priority_queue<NODE*> maxQ(true);
    vector<unique_ptr<NODE>> nodes;
    
    for (string& str : operations)
    {
        int value = stoi(str.substr(2));
 
        if (str[0== 'I')
        {
            nodes.push_back(make_unique<NODE>(value));
            NODE* node = nodes.back().get();
            
            minQ.push(node);
            maxQ.push(node);
        }
        else if (value == 1)
        {   
            while (!maxQ.empty() && maxQ.top()->isDeleted)
                maxQ.pop();
            
            
            if (!maxQ.empty())
            {
                NODE* node = maxQ.top();
                node->isDeleted = true;
                maxQ.pop();
            }
            
        }
        else if (value == -1)
        {
           while (!minQ.empty() && minQ.top()->isDeleted)
                minQ.pop();
 
            if (!minQ.empty())
            {
                NODE* node = minQ.top();
                node->isDeleted = true;
                minQ.pop();
            }
        }
        
    }
 
    while (!maxQ.empty() && maxQ.top()->isDeleted == true)
        maxQ.pop();
    
    while (!minQ.empty() && minQ.top()->isDeleted == true)
        minQ.pop();
    
    int minTop = minQ.empty() ? 0 : minQ.top()->value;
    int maxTop = maxQ.empty() ? 0 : maxQ.top()->value;
    return {maxTop, minTop};
}
cs

 

 

반응형
LIST

'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글

숫자 게임[Lv. 3]  (0) 2024.08.03
최고의 집합 [Lv. 3] (C++)  (0) 2024.08.03
보석 쇼핑 [LV. 3] (C++)  (0) 2024.07.21
경주로 건설 [Lv. 3] (C++)  (0) 2024.07.19
다단계 칫솔 판매 [Lv. 3] (C++)  (1) 2024.07.14