반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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 *a > *b; else return *a < *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 |