Heap은 완전 이진 트리(Complete Binary Tree) 형태의 자료구조로, 항상 루트(root) 노드가 최소값 또는 최대값을 유지하도록 정렬됨.
Java에서는 PriorityQueue 클래스를 사용하여 Heap을 구현할 수 있음.
PriorityQueue<Integer> minHeap = new PriorityQueue<>(); // 기본적으로 최소 힙
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder()); // 최대 힙
PriorityQueue는 기본적으로 최소 힙(Min Heap)으로 동작하며, Comparator를 이용해 정렬 기준을 바꿀 수 있음.Comparator.reverseOrder()를 사용하면 최대 힙으로 변환 가능.Heap<> 클래스를 제공하지 않을까?PriorityQueue에서 지원함.Queue는 FIFO(선입선출) 방식이라 간단하게 제공할 수 있음.PriorityQueue 같은 클래스를 활용하게 설계함.Heap<> 클래스를 만들기 어려움Heap<> 클래스를 만들려면 모든 경우를 다 포함해야 하므로 비효율적.PriorityQueue가 더 유연한 방법.📢 결론: Java는 Heap을 별도로 제공하지 않고 PriorityQueue를 활용하도록 설계했으며, 이는 더 유연하고 효율적인 방식임.
PriorityQueue<Integer> absMinHeap = new PriorityQueue<>(
Comparator.comparingInt((Integer x) -> Math.abs(x)) // 절댓값 기준 정렬
.thenComparingInt(x -> x) // 절댓값이 같으면 원래 숫자 기준 정렬
);
comparingInt(x -> Math.abs(x)) → 절댓값 기준 정렬thenComparingInt(x -> x) → 절댓값이 같으면 원래 숫자 기준으로 정렬Comparator.comparingInt(x -> Math.abs(x))는 Integer 타입에 대해 자동 추론되므로 를 명시하지 않으면 에러 발생 가능.
Java의 Comparator.comparingInt()는 내부적으로 int를 기대하기 때문에, 제네릭을 정확히 설정해야 한다.
✔ 정상 코드
PriorityQueue<Integer> heap = new PriorityQueue<>(
Comparator.<Integer>comparingInt(x -> Math.abs(x)).thenComparingInt(x -> x)
);
✔ 에러 발생 코드
PriorityQueue<int> heap = new PriorityQueue<>( // ❌ int는 제네릭 불가!
Comparator.comparingInt(x -> Math.abs(x)).thenComparingInt(x -> x)
);
➡ PriorityQueue는 사용할 수 없고, 항상 PriorityQueue를 사용해야 함.
add(E e), offer(E e) → 요소 추가poll() → 루트(최소/최대값) 제거 후 반환peek() → 루트 요소 조회(삭제하지 않음)1️⃣ Heap은 우선순위를 유지하는 자료구조이며, Java에서는 이를 PriorityQueue로 지원함.
2️⃣ Heap을 별도의 Heap<> 클래스로 제공하지 않는 이유는 다음과 같음:
PriorityQueue가 더 적합 PriorityQueue를 활용하면 된다! 🚀