프로그래밍 공부
작성일
2024. 2. 9. 00:53
작성자
WDmil
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