๐Ÿ“ Coding Test Study/C++

[C++][STL][์ž๋ฃŒ๊ตฌ์กฐ] ํž™(Heap), ์šฐ์„ ์ˆœ์œ„ ํ(Priority queue) (feat. stack, queue, deque)

ibelieveinme 2021. 9. 22. 14:33
728x90

* Heap(ํž™)

: ์ตœ๋Œ€๊ฐ’/์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ

(์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ: ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ ˆ๋ฒจ์˜ node๊ฐ€ ์™„์ „ํžˆ ์ฑ„์›Œ์ ธ ์žˆ๊ณ , ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ node๋“ค์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ๊ตฌ์กฐ)

: ์‚ฝ์ž…/์‚ญ์ œ/์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ/์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ O(logN)

: root๊ฐ€ ์ตœ๋Œ€ ๊ฐ’์„ ๊ฐ–๋Š” ์ตœ๋Œ€ ํž™(Max Heap)๊ณผ root๊ฐ€ ์ตœ์†Œ ๊ฐ’์„ ๊ฐ–๋Š” ์ตœ์†Œ ํž™(Min Heap)์ด ์žˆ์Œ

: ๊ฐ’์ด '์™ผ์ชฝ ์ž์‹ < ๋ถ€๋ชจ < ์˜ค๋ฅธ์ชฝ ์ž์‹' ์ˆœ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ํฐ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree)์™€ ๋‹ฌ๋ฆฌ '์ž์‹ < ๋ถ€๋ชจ' ํ˜•ํƒœ์˜ ๊ฐ’ ํฌ๊ธฐ๋งŒ ์œ ์ง€๋จ.

: Heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‘์šฉํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ) Priority queue(์šฐ์„ ์ˆœ์œ„ ํ)

 

 

* priority queue(์šฐ์„ ์ˆœ์œ„ ํ)

:  priority_queue<์ž๋ฃŒํ˜•, ๊ตฌํ˜„์ฒด, ๋น„๊ต์—ฐ์‚ฐ์ž> ๋กœ ์ •์˜

   1) ์ž๋ฃŒํ˜•์€ int, double ๋“ฑ์œผ๋กœ ์ง€์ •๊ฐ€๋Šฅ

   2) ๊ตฌํ˜„์ฒด์˜ ๊ธฐ๋ณธ์€ vector<์ž๋ฃŒํ˜•> ์œผ๋กœ ์ •์˜๋œ๋‹ค.

   3) ๋น„๊ต ์—ฐ์‚ฐ์ž์˜ default๊ฐ’์€ less<์ž๋ฃŒํ˜•>์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์ด๊ณ , greater<์ž๋ฃŒํ˜•>์„ ๋„ฃ์–ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main() {
    //์šฐ์„ ์ˆœ์œ„ ํ ๋‚ด๋ฆผ์ฐจ์ˆœ
    priority_queue<int> pq_less;
    
    pq_less.push(1);
    pq_less.push(5);
    pq_less.push(3);
    int pq_less_size = pq_less.size();
    for(int i=0; i<pq_less_size; i++){
       cout << pq_less.top() << " "; // 5 3 1
       pq_less.pop();
    }cout << "\n";
    
    
    //์šฐ์„ ์ˆœ์œ„ ํ ์˜ค๋ฆ„์ฐจ์ˆœ
    priority_queue<int, vector<int>, greater<int>> pq_greater;
    
    pq_greater.push(1);
    pq_greater.push(5);
    pq_greater.push(3);
    int pq_greater_size = pq_greater.size();
    for(int i=0; i<pq_greater_size; i++){
       cout << pq_greater.top() << " "; // 1 3 5
       pq_greater.pop();
    }
	
    return 0;
}

 

: pair์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, ์ธ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ ์ •๋ ฌ๋„ ํ•œ๋ฒˆ์— ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. pair์˜ first๋ฅผ ๋จผ์ € ๋น„๊ตํ•˜๊ณ  first๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ second ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌ ๋ฐ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

#include <iostream>
#include <queue>
using namespace std;

int main(){
   priority_queue<pair<int, int>> pq;
   
   pq.push(make_pair(10, 100));
   pq.push(make_pair(1, 50));
   pq.push(make_pair(1, 200));
   pq.push(make_pair(50, 50));
   pq.push(make_pair(-10, 200));
   
   int pq_size = pq.size();
   for(int i = 0; i < pq_size; i++){
      cout << pq.top().first << " " << pq.top().second << "\n";
   }
   return 0;
}

 

[C++ official reference ์ฐธ์กฐ]

 

priority_queue::priority_queue - C++ Reference

allocator versions (5)template explicit priority_queue (const Alloc& alloc); template priority_queue (const Compare& comp, const Alloc& alloc); template priority_queue (const Compare& comp, const Container& ctnr, const Alloc& alloc); template priority_queu

www.cplusplus.com

 

cf) stack, queue, deque

*stack: ์„ ์ž…์„ ์ถœ๊ตฌ์กฐ๋กœ ๋’ค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์•ž์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

        : push(), pop(), top(), empty(), size() ๋“ฑ์˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ

#include <stack>

int main(){
    stack<int> stk;
    
    stk.push(1); // 1
    stk.push(2); // 1 2
    stk.push(3); // 1 2 3 
    
    stk.pop(); // 2 3
    
    stk.top(); // 2
    
    return 0;
}

 

* queue: ํ›„์ž…์„ ์ถœ๊ตฌ์กฐ๋กœ ๋’ค๋กœ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

          : push(), pop(), front(), back(), empty(), size() ๋“ฑ์˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ

#include <queue>

int main(){
    queue<int> q;
    
    q.push(1); // 1
    q.push(2); // 1 2
    q.push(3); // 1 2 3 
    
    q.pop(); // 1 2 
    
    q.front(); // 1
    q.back(); // 2
    
    return 0;
}

 

* deque: ๋’ค๋กœ๋งŒ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ queue, vector์™€ ๋‹ฌ๋ฆฌ, ์•ž/๋’ค๋กœ ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ.

           : push_back(), push_front(), pop_back(), pop_front(), front(), back(), empty(), size(), clear() ๋“ฑ์˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ

#include <deque>

int main(){
    deque<int> dq;
    deque<int> dq2(10); // defualt(0) ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ 10๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ deque ์ƒ์„ฑ
    deque<int> dq3(10, 1); // 1๋กœ ์ดˆ๊ธฐํ™”๋œ 10๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ deque ์ƒ์„ฑ
    deque<int> dq4(dq3); // dq3์„ ๋ณต์‚ฌํ•œ dq4 ์ƒ์„ฑ
    
    dq.push_back(1); // 1
    dq.push_back(2); // 1 2
    dq.push_back(3); // 1 2 3 
    dq.push_front(0); // 0 1 2 3
    
    dq.pop_back(); // 0 1 2    
    dq.pop_front(); // 1 2
    
    dq.front(); // 1
    dq.back(); // 2
    
    return 0;
}

 

 

728x90