Posts 알고리즘 - c++의 priority_queue 사용법
Post
Cancel

알고리즘 - c++의 priority_queue 사용법


알고리즘 - c++의 priority_queue 사용법

📌 c++에서 우선순위 큐 사용하기

  • c++에서는 queue 헤더파일에서 priority_queue를 제공합니다.
  • T에는 기본 자료형인 int, char, double 뿐만 아니라 struct, class 등이 올 수 있습니다.
  • 기본적으로(default) c++의 우선순위 큐는 Max Heap으로 설정되어 있습니다. 즉, Max Heap에서는 큰 값이 우선순위가 크므로 앞에 오는 Heap으로 구성되어 있습니다. 따라서 자료형만 작성된 아래 pq는 default로 Max Heap으로 작동합니다.
1
priority_queue<T> pq;
  • 또는 아래와 같이 필요한 값 3개를 전부 작성할 수도 있습니다. 여기서 Container는 벡터 같은 컨테이너를 말하고, Compare는 비교 함수입니다.
1
priority_queue<T, Container<T>, Compare> pq;
  • 즉, 아래 두 개는 같은 표현입니다. 여기서 맨 마지막 인자 less<>의 경우, 내림차순 정렬하겠다는 의미가 됩니다. 즉, priority_queue는 기본적으로 Max Heap이라고 했는데, default가 less 이기 때문에 큰 값이 앞으로 오도록 작동했던 것입니다.
1
2
priority_queue<int> pq; // 자료형만 썼을 때 아래와 같은 default 값이 적용된다.
priority_queue<int, vector<int>, less<int>> pq; // less than operator 사용

  • 그러면 priority_queue를 Min Heap으로 쓸 수는 없을까요? 위와는 반대로, 마지막 인자에 greater<>를 넣어 주면 오름차순 정렬하겠다는 의미가 되므로 Min Heap으로 설정할 수 있습니다. 따라서 큐에는 작은 값이 앞에 오도록 자동으로 정렬됩니다.
  • 이처럼 정렬 기준을 임의로 바꿔야 할 경우, priority_queue<T> pq 처럼 축약한 선언은 불가하며, 아래와 같이 필요한 값들을 전부 넣어서 선언해야 합니다.
1
priority_queue<int, vector<int>, greater<int>> pq; // greater than operator 사용

  • 우선순위 큐에 pair가 들어가게 작성해야 할 경우가 있다면 다음과 같이 작성할 수 있습니다. T에 pair<int, int> 가 들어가는 것 뿐입니다.
  • 아래와 같이 선언하면, pair에서 first 값을 기준으로 Max-Heap 동작을 합니다.
1
priority_queue<pair<int, int>> pq;
  • 만약 pair<int, int> 형을 우선순위 큐에서 사용하고 싶은데, Min-Heap으로 동작하게 하려면 똑같은 방법으로 아래와 같이 작성합니다.
1
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,int>>> pq;
  • [참고] C++14 버전 이후에는 자료형 추론이 가능해서, 마지막 operator 를 greater<> 와 같이 자료형을 명시해서 적어주지 않아도 컴파일이 가능합니다. 하지만 여러 코딩 테스트 등 다양한 환경에서 모두 C++14 이후를 보장할 수는 없으므로 안전하게 자료형을 명시해 주는 것이 좋습니다.

[GraphQL] GraphQL로 API만들기 (2) - GraphQL 쿼리, 뮤테이션, 스키마, 리졸버

[2020 카카오 공채] 기둥과 보 설치