728x90
문제 설명
이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.
명령어 | 수신 탑(높이) |
I 숫자 | 큐에 주어진 숫자를 삽입합니다. |
D 1 | 큐에서 최댓값을 삭제합니다. |
D -1 |
큐에서 최솟값을 삭제합니다. |
이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.
제한사항
- operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
- operations의 원소는 큐가 수행할 연산을 나타냅니다.
- 원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
- 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.
입출력 예
operations | return |
["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"] | [0,0] |
["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"] | [333, -45] |
문제 해설
우선, 데이터를 명령어에 따라서 추출, 기입해야 함으로, input으로 받는 string을 분리하는것 이 중요하다.
그리고 항상 짧은 값과 큰값을 확인해야 함으로, 객체를 가져올 때 마다 값을 정리하는것 보다는 객체를 넣을때 정리하면서 들어가는것 이 더 효율적임으로 이진트리 방식을 취한다.
여기서 이진트리 방식에, 제한사항 또는 문제설명에 중복값이 들어가지 않는다 라는 것이 없음으로 multiset또는 map을 통해 중복값 예외처리를 진행해준다.
아마 큐 를 사용한다면 priority queue를 사용하면 풀 수 있다. 그러나, priorityqueue는 객체가 대입될 때 마다 sort를 해버림으로 차라리 이진트리를 사용하는것이 구조상 더 효율적이다.
전체값을 비교하면서 sort하기 때문에 priority는 별로 효율적이지 않다.
첫 번째 시도
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<int> solution(vector<string> operations) {
map<int, int> sortedMap;
vector<int> answer;
for (auto& order : operations)
{
if (order[0] == 'I') {
sortedMap[stoi(order.substr(2))]++;
}
if (!sortedMap.empty()) {
if (order == "D 1") {
sortedMap.rbegin()->second--;
if (sortedMap.rbegin()->second == 0)
sortedMap.erase(sortedMap.rbegin()->first);
}
else if (order == "D -1") {
sortedMap.begin()->second--;
if (sortedMap.begin()->second == 0)
sortedMap.erase(sortedMap.begin()->first);
}
}
}
if (sortedMap.empty()) {
answer.resize(2);
}
else
{
answer.emplace_back(sortedMap.rbegin()->first);
answer.emplace_back(sortedMap.begin()->first);
}
return answer;
}
성공
힙이라기 보다는 그냥 이진트리형태의 데이터정렬과 데이터정렬 이후에 값을 뽑아오는 방법을 이해하면 된다.
stirng 의 substr을 사용하면 쉽게 데이터를 분류할 수 있다.
구조상 enum을 사용해서 데이터를 분류하고 싶어도, 코딩테스트라 한곳에 뭉쳐야하는게 슬펐다.
728x90
'코딩테스트 문제 풀이 > 힙[Heap]' 카테고리의 다른 글
디스크 컨트롤러 (0) | 2024.01.31 |
---|