공부/코딩

C++과 Java에서 Priority Queue의 차이점

finding wangdo 2023. 10. 19. 21:28

C++에서는 

#include <queue>

를 해주고 Java에서는

import java.util.PriorityQueue;

를 해주어 Priority Queue(우선순위 큐) 자료구조를 사용할 수 있게 해준다.

 

 

 

1. Priority Queue 선언

 

C++:

priority_queue<int> pq_int;
priority_queue<long long> pq pq_ll;

이와 같이 priority_queue<자료형>으로 선언할 수 있다.

 

Java:

PriorityQueue<int> pq = new PriorityQueue<>();

자바에서는 new 뒤까지 써주어야 한다.

 

 

2. 우선 순위

 

C++에서는 기본적으로 Priority Queue가 큰 값을 우선순위로 두지만 Java는 작은 값을 우선순위로 둔다.

예를 들어 1, 3, 5, 7이 Priority Queue 안에 들어있을 때, C++에서 첫 번째 값을 반환하는 함수인

pq.top()

는 7을 반환하고 Java에서 첫 번째 값을 반환하는 함수인

pq.peek()

는 1을 반환한다.

 

 

3. Priority Queue에서 사용되는 함수(메소드)

 

Priority Queue에서 사용되는 함수로는

  • 요소 삽입 (push)
  • 첫 번째 요소 반환
  • 첫 번째 요소 삭제 (pop)
  • 비어있는지 확인

가 대표적이다.

 

C++에서는 이렇게 쓴다.

pq.push(x); // pq에 x를 삽입 (push)

y = pq.top(); // pq의 첫 번째 요소를 반환해 y에 저장

pq.pop(); // pq의 첫 번째 요소 삭제 (pop)

pq.empty(); // pq가 비어있다면 true, 아니라면 false 반환

Java에서는 이렇게 쓴다.

pq.add(x);
pq.insert(x)
// add와 insert 둘 중 어느 것을 사용해도 된다. (push)


pq.peek(); // 첫 번째 값 반환. 만약 pq가 비어있다면 null 반환.
pq.element(); // 첫 번째 값 반환. 만약 비어있다면 예외발생.
// 기능은 같지만 필요에 따라 골라 쓰면 된다.


pq.poll(); // 첫 번째 값을 반환하면서 제거함. 만약 비어있다면 null 반환 (pop)
pq.remove(); // 첫 번째 값 제거. 만약 비어있다면 예외발생. (pop)
// 역시나 필요에 따라 골라 쓰면 된다.


pq.isEmpty() // 비어있다면 true, 아니라면 false 반환

 

 

 

4. 정리

 

아무래도 가장 중요한 차이점은 C++에선 큰 게 우선이고 Java에서는 작은 게 우선이라는 거다. ChatGPT한테 C++ 코드를 Java로 바꿔달라고 했더니 그 차이점을 몰라서인지 코드를 잘못 구현해놓은 적이 있다.

 

아래는 Priority Queue를 사용해야 하는 백준 문제 하나 추천.

https://www.acmicpc.net/problem/30205