boj 11286 , 11279, 1927번 문제를 통해 보는, priority_queue와 최대 힙, 최소 힙. **gpt를 너무 맹신하지 않도록 주의하자**

boj 11286, 11279, 1927 번 문제들을 풀면서, 

최대힙으로 문제를 풀어야 할때, 

최소힙으로 문제를 풀어야 할때 등이 있었는데, 

이때에 c++ stl에 있는 priority_queue<int> pq; 형태로 사용시 기본으로 Max Heap(최대 힙)이 되고, 

만약 최소 힙을 사용하고 싶으면 priority_queue<int, vector<int>, greater<int>> pq; 형태로 선언해야 Min Heap(최소 힙)이 된다고 하여서 그게 관하여서 한번 검색해보았다. 

 

<첫번째>

<두번째>

 

<세번째>

 

이와 같은 내용들을 gpt를 통해 받을 수 있었는데, 

위의 내용들을 보면, <첫 번째> 와 <두 번째> 의 경우는 기본적으로 내부 컨테이너가 deque로 되어있다 라는 얘기를 하고있고, 

<세 번째> 는 내부 구현에 사용하는 컨테이너로 deque대신 vetor를 사용하는것이 더 효율적이라고 설명하고 있다. 

 

위의 내용들이 내부 구현 컨테이너에 대한 정보가 상반되는 것 같아서 이에 대해서 cplusplus 사이트에서 찾아보았다. 

https://cplusplus.com/reference/queue/priority_queue/?kw=priority_queue 

 

https://cplusplus.com/reference/queue/priority_queue/?kw=priority_queue

container_typeThe second template parameter (Container)Type of the underlying container

cplusplus.com

사이트를 통해 알 수 있는 부분은, 특별하게 따로 정해주지 않으면 기본적으로 vector를 이용해서 내부 컨테이너로 이용한다고 한다. 

그리고 priority_queue를 선언할때 에디터상에 이 함수에 대해서 설명이 나오는 부분을 첨부해보면, 

 

이처럼 여기서도 <타입, 컨테이너의 타입네임=vector , compare= less> 형태로 나오는걸 볼 수 있다. 그래서 특별하게

지정해 주지 않으면 priority_queue<int> 로 선언하면, 내부 컨테이너로 vetor를 사용하고, compare 함수로 less 를 전해주는

priority_queue가 되는 것이다. 

 

이를 통해 이해해볼 수 있는것은, 기본적으로 최대힙의 경우, 원래 풀로 쓰면, 

priority_queue<int, vector<int>, less<int>> 형태로 되는 것이고, 

이걸 간략하게

priority_queue<int> 로 써서 가장 기본적으로 최대힙으로 사용하는 형태이고, 이걸 최소 힙으로 사용하고 싶으면, compare 함수를 바꾸어 주어야 하기 때문에, 그걸 작성하기 위해서

 

priority_queue<int, vector<int>, greater<int>> 로 써주어야 하는 것으로 생각된다. 

혹시 priority_queue<int, , greater<int>> 로 사용할 수 있을까 하고 실험을 해보면, 

현재 내가 사용하고 있는 상황에서는 되지 않는다. 

 

 

gpt에 다시한번 priority_queue의 내부 구현에 컨테이너를 무엇을 사용하는지 물어보았는데 이번엔 답이 또 말이 바뀌었다. 

 

 

gpt를 기본적으로 언어의 문법을 이해하고 배우는데 많이 활용하고 있는데, 너무 믿지 말도록 하자. 

가장 기본적인건 결국 컴파일러 상에서 요구하는 기본 요소들에 대해서 함수에 제시된 설명을 통해 잘 파악하도록 하고, 

그 이후에는 cplusplus 사이트를 통해서 공부하도록 하자. gpt를 통해 얻을 결과는 너무 맹신하지 않도록 주의하자. 

 

+++++++++++++++++++++++++
추가적으로, 기본적으로 vetor<int> 를 내부 컨테이너로 사용하고, 사용할 수 있는 경우가 vector와 deque라고 했으니, deque<int>를 넣어보면 사용할 수 있겠구나 싶어서 넣어보았다. 

이와 같이 아무런 문제없이 잘 작성됨을 확인할 수 있었다. 

 

그리고 내부 컨테이너를 deque<int> 로 바꾼 코드를 11279 문제에 제출해보았는데 통과하였다. 

 

**기본 내부 컨테이너는 vector로 되어있다는것, 그리고 deque로 바꾸어서 사용할 수 있다는 것을 기억하고, 

priority_queue의 완전한 형태가

priority_queue<int, vector<int>, greater<int>> 형태 라는걸 이해하고 사용하도록 하자. 

 

  Comments,     Trackbacks