μ°μ μμ ν(Priority Queue)
μΌλ°μ μΈ νμ ꡬ쑰λ FIFO(Firtst In First Out)λ‘ λ°μ΄ν°κ° λ€μ΄μ¨ μμλλ‘ λκ°κ² λ©λλ€.
μ°μ μμ νλ μ΄λ¬ν νμ νΉμ±μ κ°μ§λ©΄μ λ€μ΄μ¨ μμλλ‘κ° μλλΌ
μ°μ μμλ₯Ό λ¨Όμ κ²°μ νκ³ , κ·Έ μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λκ°λ μλ£ κ΅¬μ‘°μ λλ€.
μΌλ°μ μΌλ‘ ν(Heap)μ μ΄μ©νμ¬ κ΅¬νν©λλ€.
νμ νμ μ΅λκ° λλ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύμλ΄κΈ° μν μμ μ΄μ§ νΈλ¦¬ ꡬ쑰μ λλ€.

μ΅λκ° νΉμ μ΅μκ°μΌλ‘ κ°μ₯ λ¨Όμ νμν΄μΌ νλ μμ, μ¦ μ°μ μμκ° κ°μ₯ λμ μμκ° λ£¨νΈ λ Έλμ μμ΅λλ€.
λΆλͺ¨ λ Έλκ° νμ μμ λ Έλλ³΄λ€ μ°μ μμκ° λμ κ±°μ£ .
μλ‘μ΄ λ°μ΄ν°λ₯Ό 리ν λ Έλμ λ£κ³ , 루νΈ(κ°μ₯ μ°μ μμ λμ λ°μ΄ν°)λ₯Ό μ κ±°νλ©΄ μ°μ μμ νλ‘ μ¬μ©ν μ μμ΅λλ€.
μ°μ μ μΌλ‘ μμ ν λ Έλ νλλ λ 루νΈμ μμΌλ©΄μ, λ΄λΆλ μ λ ¬λμ΄ μμ§ μμ΅λλ€. κΊΌλΌ λλ§λ€ μ°μ μ μΌλ‘ κΊΌλΌ μμ νλκ° μ ν΄μ§λλ€.
μ΅λκ°μ μ΅μ°μ μΌλ‘ νκ³ μΆλ€λ©΄ μ΅λ ν(Max Heap)μ, μ΅μκ°μ μ΅μ°μ μΌλ‘ νκ³ μΆλ€λ©΄ μ΅μ ν(Min Heap)μ μ¬μ©νλ©΄ λ©λλ€.
νμΌλ‘ μ°μ μμ νλ₯Ό ꡬνν κ²½μ°, μκ°λ³΅μ‘λλ λ€μκ³Ό κ°μ΅λλ€.
- μ°μ μμκ° κ°μ₯ λμ κ°μ νμνλ μκ°μ O(1)
- λ°μ΄ν°λ₯Ό μ½μ νλ μκ°μ O(logN)
- λ°μ΄ν°λ₯Ό μμ νλ μκ°μ O(logN)
Javaμμ μ¬μ©νκΈ°
Importμ μ μΈ
`PriorityQueue`λ₯Ό μ¬μ©νκΈ° μν΄μλ `java.util.PriorityQueue`λ₯Ό importν΄μΌ ν©λλ€.
κΈ°λ³Έμ μΌλ‘ μ΅μ ν(μ€λ¦μ°¨μ)μΌλ‘ ꡬνλμ΄ μμ΅λλ€.
λ§μ½ μ΅λ ν(λ΄λ¦Όμ°¨μ)μΌλ‘ μ¬μ©νκ³ μΆλ€λ©΄ `Collections.reverseOrder()`μ΄ νμν©λλ€.
μΌλ°μ μΌλ‘ μ½λ©ν μ€νΈμμλ `java.util.*` λ‘ util ν¨ν€μ§λ₯Ό μ 체 importνλ λ°λ‘ CollectionsκΉμ§ μΈμΈ νμλ μμ λ― ν©λλ€.
import java.util.Collections;
import java.util.PriorityQueue;
public class Main{
public static void main(String[] args) {
// μ΅μ νμΌλ‘ ꡬνν μ°μ μμ ν
PriorityQueue<Integer> priorityQueueLowest = new PriorityQueue<>();
// μ΅λ νμΌλ‘ ꡬνν μ°μ μμ ν
PriorityQueue<Integer> priorityQueueHighest = new PriorityQueue<>(Collections.reverseOrder());
}
}
μ£Όμ λ©μλ
| `public boolean add(E e)` | νμ μμ μ½μ , κ³΅κ° λΆμ‘± μ μμΈ λ°μ |
| `public boolean offer(E e)` | νμ μμ μ½μ , κ³΅κ° λΆμ‘± μ false λ°ν |
| `public E peek()` | κ°μ₯ μ°μ μμ λμ μμ νμΈ (μμ X) |
| `public E poll()` | κ°μ₯ μ°μ μμ λμ μμ κΊΌλ΄κΈ° (μμ O) |
| `public boolean remove(Object o)` | νΉμ μμ μ κ±° |
| `public boolean isEmpty()` | νκ° λΉμλμ§ νμΈ |
| `public int size()` | μ 체 μμ κ°μ νμΈ |
| `public void clear()` | ν λΉμ°κΈ° |
μ 체 μ½λ
import java.util.PriorityQueue;
public class Main{
public static void main(String[] args) {
// μ΅μ νμΌλ‘ ꡬνν μ°μ μμ ν
PriorityQueue<Integer> priorityQueueLowest = new PriorityQueue<>();
priorityQueueLowest.offer(5);
priorityQueueLowest.offer(4);
priorityQueueLowest.offer(2);
priorityQueueLowest.offer(1);
priorityQueueLowest.offer(3);
System.out.println("νμ¬ μ΅μ ν νμ λ£¨νΈ = " + priorityQueueLowest.peek());
System.out.println("μμ 1, μμ λ μμ = " + priorityQueueLowest.poll());
System.out.println("νμ¬ μ΅μ ν νμ λ£¨νΈ = " + priorityQueueLowest.peek());
System.out.println("μμ 2, μμ λ μμ = " + priorityQueueLowest.poll());
System.out.println("νμ¬ μ΅μ ν νμ λ£¨νΈ = " + priorityQueueLowest.peek());
System.out.println("μμ 3, μμ λ μμ = " + priorityQueueLowest.poll());
System.out.println("νμ¬ μ΅μ ν νμ λ£¨νΈ = " + priorityQueueLowest.peek());
System.out.println("μμ 4, μμ λ μμ = " + priorityQueueLowest.poll());
System.out.println("νμ¬ μ΅μ ν νμ λ£¨νΈ = " + priorityQueueLowest.peek());
System.out.println("μμ 5, μμ λ μμ = " + priorityQueueLowest.poll());
if (priorityQueueLowest.isEmpty()) {
System.out.println("μ΅μ ν νκ° λΉμμ΅λλ€.");
} else {
System.out.println("μ΅μ ν νμ μμ§ " + priorityQueueLowest.size() + "κ°μ μμκ° μμ΅λλ€.");
}
}
}
| μΆλ ₯ // 1, 2, 3, 4, 5 μμ μμλλ‘ μμ λ¨ νμ¬ μ΅μ ν νμ λ£¨νΈ = 1 μμ 1, μμ λ μμ = 1 νμ¬ μ΅μ ν νμ λ£¨νΈ = 2 μμ 2, μμ λ μμ = 2 νμ¬ μ΅μ ν νμ λ£¨νΈ = 3 μμ 3, μμ λ μμ = 3 νμ¬ μ΅μ ν νμ λ£¨νΈ = 4 μμ 4, μμ λ μμ = 4 νμ¬ μ΅μ ν νμ λ£¨νΈ = 5 μμ 5, μμ λ μμ = 5 μ΅μ ν νκ° λΉμμ΅λλ€. |
import java.util.Collections;
import java.util.PriorityQueue;
public class Main{
public static void main(String[] args) {
// μ΅λ νμΌλ‘ ꡬνν μ°μ μμ ν
PriorityQueue<Integer> priorityQueueHighest = new PriorityQueue<>(Collections.reverseOrder());
priorityQueueHighest.offer(2);
priorityQueueHighest.offer(4);
priorityQueueHighest.offer(5);
priorityQueueHighest.offer(3);
priorityQueueHighest.offer(1);
System.out.println("νμ¬ μ΅λ ν νμ λ£¨νΈ = " + priorityQueueHighest.peek());
System.out.println("μμ 1, μμ λ μμ = " + priorityQueueHighest.poll());
System.out.println("νμ¬ μ΅λ ν νμ λ£¨νΈ = " + priorityQueueHighest.peek());
System.out.println("μμ 2, μμ λ μμ = " + priorityQueueHighest.poll());
System.out.println("νμ¬ μ΅λ ν νμ λ£¨νΈ = " + priorityQueueHighest.peek());
System.out.println("μμ 3, μμ λ μμ = " + priorityQueueHighest.poll());
System.out.println("νμ¬ μ΅λ ν νμ λ£¨νΈ = " + priorityQueueHighest.peek());
System.out.println("μμ 4, μμ λ μμ = " + priorityQueueHighest.poll());
if (priorityQueueHighest.isEmpty()) {
System.out.println("μ΅λ ν νκ° λΉμμ΅λλ€.");
} else {
System.out.println("μ΅λ ν νμ μμ§ " + priorityQueueHighest.size() + "κ°μ μμκ° μμ΅λλ€.");
}
}
}
| μΆλ ₯ // 5, 4, 3, 2, 1 ν° μμλλ‘ μμ νμ¬ μ΅λ ν νμ λ£¨νΈ = 5 μμ 1, μμ λ μμ = 5 νμ¬ μ΅λ ν νμ λ£¨νΈ = 4 μμ 2, μμ λ μμ = 4 νμ¬ μ΅λ ν νμ λ£¨νΈ = 3 μμ 3, μμ λ μμ = 3 νμ¬ μ΅λ ν νμ λ£¨νΈ = 2 μμ 4, μμ λ μμ = 2 μ΅λ ν νμ μμ§ 1κ°μ μμκ° μμ΅λλ€. |
