[Java] μš°μ„ μˆœμœ„ 큐(Priority Queue) κ°œλ…κ³Ό μžλ°” κΈ°λ³Έ λ©”μ†Œλ“œ

2025. 11. 13. 12:22Β·β˜•Java

μš°μ„ μˆœμœ„ 큐(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개의 μ›μ†Œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

'β˜•Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] μœ„μƒ μ •λ ¬(Topological Sort) κ°œλ…κ³Ό κ΅¬ν˜„  (0) 2025.11.14
[Java] κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection) κΈ°λ³Έ κ°œλ…  (0) 2025.10.18
[Java] JVMμ΄λž€? κ°œλ…κ³Ό μžλ°” 컴파일 κ³Όμ • μ΄ν•΄ν•˜κΈ°  (0) 2025.10.03
[Java] λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œμ˜ 경쟁 μƒνƒœμ™€ ν•΄κ²° μ „λž΅ 정리  (1) 2025.06.02
[자료ꡬ쑰][Java] HashSet 쀑볡 제거 λ™μž‘ 원리: HashSet은 μ–΄λ–»κ²Œ 쀑볡을 ν™•μΈν•˜λ‚˜μš”?  (0) 2025.02.13
'β˜•Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Java] μœ„μƒ μ •λ ¬(Topological Sort) κ°œλ…κ³Ό κ΅¬ν˜„
  • [Java] κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection) κΈ°λ³Έ κ°œλ…
  • [Java] JVMμ΄λž€? κ°œλ…κ³Ό μžλ°” 컴파일 κ³Όμ • μ΄ν•΄ν•˜κΈ°
  • [Java] λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œμ˜ 경쟁 μƒνƒœμ™€ ν•΄κ²° μ „λž΅ 정리
μ†Œμ˜ πŸ€
μ†Œμ˜ πŸ€
Hello World ✨
  • μ†Œμ˜ πŸ€
    Soyoung's Dev Lab
    μ†Œμ˜ πŸ€
  • 전체
    였늘
    μ–΄μ œ
  • κΈ€μ“°κΈ° 관리
    • λΆ„λ₯˜ 전체보기 (79)
      • πŸ“’ κ²Œμ‹œνŒ (0)
      • 🌿Spring (20)
      • β˜•Java (7)
        • μ½”λ”©ν…ŒμŠ€νŠΈ (7)
      • βš™οΈ CS (26)
        • πŸ›œ λ„€νŠΈμ›Œν¬ (5)
        • πŸ“Š λ°μ΄ν„°λ² μ΄μŠ€ (8)
        • πŸ–²οΈμš΄μ˜μ²΄μ œ (9)
        • πŸ“š 자료ꡬ쑰 & μ•Œκ³ λ¦¬μ¦˜ (4)
      • πŸ“€ 배포 (4)
        • Docker (4)
        • AWS (0)
      • πŸ“° 기타 개발 자료 (12)
      • πŸ–₯️ ν”„λ‘œμ νŠΈ (0)
      • πŸ‘©‍πŸ’» ν™œλ™ & ν›„κΈ° (1)
      • 🍡 이야기 (2)
  • λΈ”λ‘œκ·Έ 메뉴

    • νƒœκ·Έ
  • 링크

    • github
    • velog
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    배포
    μ½”λ“œμž‡ μŠ€ν”„λ¦°νŠΈ
    GIT
    μ½”λ”©ν…ŒμŠ€νŠΈ
    운영체제
    Spring
    λ°μ΄ν„°λ² μ΄μŠ€
    μ„œλ²„
    기술 λ©΄μ ‘
    μ•Œκ³ λ¦¬μ¦˜
    Spring Security
    자료ꡬ쑰
    λ„€νŠΈμ›Œν¬
    docker
    객체지ν–₯ν”„λ‘œκ·Έλž˜λ°
    Java
    개발
    μœ„ν΄λ¦¬ 페이퍼
  • 졜근 λŒ“κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
μ†Œμ˜ πŸ€
[Java] μš°μ„ μˆœμœ„ 큐(Priority Queue) κ°œλ…κ³Ό μžλ°” κΈ°λ³Έ λ©”μ†Œλ“œ
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”