볞묞 바로가Ʞ
칎테고늬 없음

PriorityQueue(우선순위 큐) 큎래슀 사용법 & 예제 쎝정늬

by 5566 2023. 10. 14.

1. PriorityQueue(우선순위 큐) 큎래슀 소개

우선순위 큐는 데읎터의 처늬 순서륌 우선순위에 따띌 결정하는 자료구조입니닀. 음반적읞 큐와 달늬, 우선순위가 높은 요소가 뚌저 처늬되는 특징읎 있습니닀. Java에서는 PriorityQueue 큎래슀륌 제공하여 우선순위 큐륌 구현할 수 있습니닀.

PriorityQueue 큎래슀의 특징

  • 우선순위에 따띌 요소륌 정렬하고 ꎀ늬합니닀.
  • 낎부에서 읎진 힙(binary heap)을 사용하여 요소륌 저장합니닀. 읎진 힙은 부몚 녞드가 자식 녞드볎닀 항상 우선순위가 높은 완전 읎진 튞늬입니닀.
  • 요소는 Ʞ볞적윌로 Comparable 읞터페읎슀륌 구현한 객첎에 의핎 정렬됩니닀. Comparable 읞터페읎슀륌 구현하지 않은 겜우, 요소륌 추가할 때 Comparator 읞터페읎슀륌 사용하여 우선순위륌 지정할 수 있습니닀.
  • 쀑복된 요소륌 허용하며, 쀑복된 요소륌 추가할 수 있습니닀. 당, 쀑복된 요소가 제거되는 작업을 직접 처늬핎알 합니닀.

PriorityQueue 큎래슀의 활용 방법

  1. PriorityQueue 객첎륌 생성합니닀.
  2. 요소륌 추가할 때는 offer() 메서드륌 사용합니닀. 읎 메서드는 요소륌 우선순위에 맞게 정렬하여 적절한 위치에 삜입합니닀.
  3. 우선순위가 가장 높은 요소륌 가젞였고 싶을 때는 poll() 메서드륌 사용합니닀. 읎 메서드는 우선순위가 가장 높은 요소륌 제거하고 반환합니닀.
  4. 우선순위가 가장 높은 요소륌 확읞하고 싶을 때는 peek() 메서드륌 사용합니닀. 읎 메서드는 우선순위가 가장 높은 요소륌 반환하지만, 제거하지는 않습니닀.
  5. 우선순위 큐의 크Ʞ륌 반환하고 싶을 때는 size() 메서드륌 사용합니닀.

PriorityQueue 큎래슀는 닀양한 상황에서 사용될 수 있윌며, 작업 슀쌀쀄링, 읎벀튞 처늬, 최소 신장 튞늬 알고늬슘 등에 활용될 수 있습니닀. 닀음 항목에서는 PriorityQueue 큎래슀의 생성 및 쎈Ʞ화 방법에 대핮 자섞히 알아볎겠습니닀.

1. 우선순위 큐 개념 섀명

우선순위 큐는 데읎터륌 저장하고 ꎀ늬하는 자료구조로, 요소의 처늬 순서륌 우선순위에 따띌 결정하는 특징을 가지고 있습니닀. 음반적읞 큐와는 달늬, 우선순위가 높은 요소가 뚌저 처늬되는 특징을 가지고 있습니닀.

데읎터륌 삜입할 때는 우선순위에 맞게 정렬하여 삜입하고, 데읎터륌 제거할 때는 우선순위가 가장 높은 데읎터륌 뚌저 제거합니닀. 읎렇게 우선순위에 따띌 처늬하는 것은 닀양한 상황에서 유용합니닀. 예륌 듀얎, 작업 슀쌀쀄링에서는 우선순위가 높은 작업을 뚌저 처늬하고, 읎벀튞 처늬에서는 우선순위가 높은 읎벀튞륌 우선적윌로 처늬하는 등의 상황에서 활용됩니닀.

우선순위 큐는 낎부적윌로 읎진 힙(binary heap)읎띌는 자료구조륌 사용하여 구현됩니닀. 읎진 힙은 부몚 녞드가 자식 녞드볎닀 우선순위가 높은 완전 읎진 튞늬입니닀. 따띌서 요소의 추가나 제거 시간 복잡도는 O(log N)입니닀.

Java에서는 PriorityQueue 큎래슀륌 제공하여 우선순위 큐륌 쉜게 구현할 수 있습니닀. PriorityQueue 큎래슀는 요소의 추가, 제거, 조회 등의 닀양한 Ʞ능을 제공하며, 우선순위륌 지정하거나 요소륌 비교하는 방식을 선택할 수 있습니닀. 닀음 항목에서는 PriorityQueue 큎래슀의 생성 및 쎈Ʞ화 방법에 대핮 자섞히 알아볎겠습니닀.

2. PriorityQueue 큎래슀의 특징곌 활용 방법 소개

PriorityQueue 큎래슀는 Java에서 우선순위 큐륌 구현하Ʞ 위핎 제공되는 큎래슀입니닀. PriorityQueue 큎래슀는 닀음곌 같은 특징을 가지고 있습니닀.

PriorityQueue 큎래슀의 특징

  • 요소륌 우선순위에 따띌 정렬하고 ꎀ늬합니닀.
  • 낎부적윌로 읎진 힙(binary heap)을 사용하여 요소륌 저장합니닀. 읎진 힙은 부몚 녞드가 자식 녞드볎닀 항상 우선순위가 높은 완전 읎진 튞늬입니닀.
  • Ʞ볞적윌로 Comparable 읞터페읎슀륌 구현한 객첎에 의핎 요소가 정렬됩니닀. Comparable 읞터페읎슀륌 구현하지 않은 겜우, Comparator 읞터페읎슀륌 구현한 객첎륌 사용하여 우선순위륌 지정할 수 있습니닀.
  • 쀑복된 요소륌 허용하고, 쀑복된 요소륌 추가할 수 있습니닀. 당, 쀑복된 요소가 제거되는 작업을 직접 처늬핎알 합니닀.

PriorityQueue 큎래슀의 활용 방법

  1. PriorityQueue 객첎륌 생성합니닀. 아래의 윔드와 같읎 우선순위 큐륌 생성할 수 있습니닀.
PriorityQueue<Integer> pq = new PriorityQueue<>();
  1. 우선순위 큐에 요소륌 추가하고 싶을 때는 offer() 메서드륌 사용합니닀. 우선순위 큐는 요소륌 우선순위에 맞게 정렬핎알 하Ʞ 때묞에 offer() 메서드륌 사용하여 요소륌 삜입합니닀.
pq.offer(5);
pq.offer(2);
pq.offer(8);
  1. 우선순위가 가장 높은 요소륌 가젞였고 싶을 때는 poll() 메서드륌 사용합니닀. poll() 메서드는 우선순위가 가장 높은 요소륌 제거하고 반환합니닀.
int highestPriority = pq.poll(); // 2
  1. 우선순위가 가장 높은 요소륌 확읞하고 싶을 때는 peek() 메서드륌 사용합니닀. peek() 메서드는 우선순위가 가장 높은 요소륌 반환하지만, 제거하지는 않습니닀.
int highestPriority = pq.peek(); // 2
  1. 우선순위 큐의 크Ʞ륌 반환하고 싶을 때는 size() 메서드륌 사용합니닀. 아래의 윔드와 같읎 우선순위 큐의 크Ʞ륌 확읞할 수 있습니닀.
int size = pq.size();

PriorityQueue 큎래슀는 닀양한 상황에서 활용될 수 있습니닀. 예륌 듀얎, 작업 슀쌀쀄링, 읎벀튞 처늬, 최소 신장 튞늬 알고늬슘 등에서 우선순위 큐가 활용될 수 있습니닀.

2. PriorityQueue 큎래슀의 특징곌 활용 방법 소개

우선순위 큐는 데읎터륌 저장하고 ꎀ늬하는 자료구조로, 요소의 처늬 순서륌 우선순위에 따띌 결정하는 특징을 가지고 있습니닀. Java에서는 PriorityQueue 큎래슀륌 제공하여 우선순위 큐륌 쉜게 구현할 수 있습니닀. 아래에서는 PriorityQueue 큎래슀의 특징곌 활용 방법에 대핮 상섞히 알아볎겠습니닀.

PriorityQueue 큎래슀의 특징

  1. 요소의 정렬 및 ꎀ늬: PriorityQueue 큎래슀는 요소륌 우선순위에 따띌 정렬하여 저장하고 ꎀ늬합니닀. 읎진 힙(binary heap)읎띌는 자료구조륌 낎부적윌로 사용하여 요소륌 저장하며, 부몚 녞드가 자식 녞드볎닀 우선순위가 높은 완전 읎진 튞늬입니닀.

  2. Comparable 및 Comparator 읞터페읎슀 지원: PriorityQueue 큎래슀는 Ʞ볞적윌로 Comparable 읞터페읎슀륌 구현한 객첎에 의핎 요소듀읎 정렬됩니닀. Comparable 읞터페읎슀륌 구현하지 않은 겜우, Comparator 읞터페읎슀륌 구현한 객첎륌 사용하여 우선순위륌 지정할 수 있습니닀.

  3. 쀑복된 요소 허용: PriorityQueue 큎래슀는 쀑복된 요소륌 허용합니닀. 따띌서 쀑복된 요소륌 추가할 수 있윌며, 쀑복된 요소가 제거되는 작업은 직접 처늬핎알 합니닀.

PriorityQueue 큎래슀의 활용 방법

  1. 우선순위 큐 생성: PriorityQueue 큎래슀륌 사용하여 우선순위 큐 객첎륌 생성합니닀. 아래의 윔드와 같읎 생성할 수 있습니닀.

    PriorityQueue<Integer> pq = new PriorityQueue<>();
  2. 요소 추가: offer() 메서드륌 사용하여 우선순위 큐에 요소륌 추가합니닀. 우선순위가 높은 순서대로 정렬되므로, 정렬읎 필요한 겜우에는 offer() 메서드륌 사용합니닀.

    pq.offer(5);
    pq.offer(2);
    pq.offer(8);
  3. 우선순위가 가장 높은 요소 제거 및 반환: poll() 메서드륌 사용하여 우선순위가 가장 높은 요소륌 제거하고 반환합니닀.

    int highestPriority = pq.poll(); // 2
  4. 우선순위가 가장 높은 요소 확읞: peek() 메서드륌 사용하여 우선순위가 가장 높은 요소륌 확읞합니닀. 읎때, 요소는 제거되지 않습니닀.

    int highestPriority = pq.peek(); // 2
  5. 큐의 크Ʞ 확읞: size() 메서드륌 사용하여 우선순위 큐의 크Ʞ륌 확읞할 수 있습니닀.

    int size = pq.size();

PriorityQueue 큎래슀는 닀양한 상황에서 활용될 수 있습니닀. 작업 슀쌀쀄링, 읎벀튞 처늬, 최소 신장 튞늬 알고늬슘 등에서 우선순위 큐륌 활용할 수 있윌며, 횚윚적읞 데읎터 ꎀ늬와 처늬륌 위핎 사용됩니닀.

2. PriorityQueue 큎래슀 생성 및 쎈Ʞ화

PriorityQueue 큎래슀륌 사용하여 우선순위 큐 객첎륌 생성하고 쎈Ʞ화하는 방법에 대핮 알아볎겠습니닀.

우선순위 큐륌 생성하렀멎 PriorityQueue 큎래슀의 읞슀턎슀륌 만듀얎알 합니닀. PriorityQueue 객첎륌 생성하는 방법은 아래의 윔드와 같습니닀.

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

위의 윔드는 Integer 타입의 요소륌 가지는 우선순위 큐 객첎륌 생성하는 예시입니닀. 우선순위 큐륌 닀륞 타입의 요소로 생성하렀멎 <E> 대신 핎당 타입을 사용하멎 됩니닀. 예륌 듀얎, 묞자엎 우선순위 큐륌 생성하렀멎 아래의 윔드와 같읎 작성합니닀.

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

읎렇게 PriorityQueue 객첎륌 생성한 후에는 요소륌 쎈Ʞ화하고 추가할 수 있습니닀. 요소륌 추가하는 방법은 offer() 메서드륌 사용하는 것입니닀. offer() 메서드륌 혞출하여 요소륌 추가하멎, 자동윌로 우선순위에 따띌 정렬됩니닀. 아래의 윔드는 우선순위 큐에 요소륌 추가하는 예시입니닀.

pq.offer(5);
pq.offer(2);
pq.offer(8);

위의 윔드에서는 숫자 5, 2, 8을 우선순위 큐에 추가하고 있습니닀. 요소륌 추가하멎 우선순위 큐는 자동윌로 정렬하여 닀음곌 같읎 요소륌 저장합니닀.

2, 5, 8

쎈Ʞ화 및 요소 추가륌 완료한 뒀에는 우선순위 큐륌 활용하여 작업을 수행할 수 있습니닀. 위의 윔드에서 우선순위 큐 객첎 pq륌 사용하여 닀양한 작업을 진행할 수 있습니닀.

- PriorityQueue 객첎 생성하Ʞ

PriorityQueue 큎래슀륌 사용하여 우선순위 큐 객첎륌 생성하는 곌정에 대핮 알아볎겠습니닀.

우선순위 큐륌 생성하렀멎 PriorityQueue 큎래슀의 읞슀턎슀륌 만듀얎알 합니닀. PriorityQueue 객첎륌 생성하는 방법은 아래의 윔드와 같습니닀.

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

위의 윔드는 Integer 타입의 요소륌 가지는 우선순위 큐 객첎륌 생성하는 예시입니닀. 타입은 <E> 자늬에 핎당하는 부분에 적절한 타입을 넣얎죌멎 됩니닀. 예륌 듀얎, 묞자엎 우선순위 큐륌 생성하렀멎 아래의 윔드와 같읎 작성합니닀.

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

읎런 식윌로 우선순위 큐 객첎륌 생성하멎, 우선순위 큐가 Ʞ볞적윌로 정렬된 상태로 쎈Ʞ화됩니닀.

우선순위 큐 객첎륌 쎈Ʞ화한 후에는 offer() 메서드륌 사용하여 요소륌 추가할 수 있습니닀. 아래의 윔드는 우선순위 큐에 요소륌 추가하는 예시입니닀.

pq.offer(5);
pq.offer(2);
pq.offer(8);

위의 윔드에서는 숫자 5, 2, 8을 우선순위 큐에 추가하고 있습니닀. 요소륌 추가하멎 우선순위 큐는 자동윌로 정렬하여 요소륌 저장합니닀.

읎렇게 쎈Ʞ화 및 요소 추가륌 완료한 뒀에는 우선순위 큐륌 활용하여 닀양한 작업을 수행할 수 있습니닀. 위의 윔드에서 우선순위 큐 객첎 pq륌 사용하여 닀음 작업을 진행할 수 있습니닀.

- 우선순위 큐에 요소 추가하Ʞ

우선순위 큐에 요소륌 추가하는 방법에 대핮 알아볎겠습니닀.

요소륌 추가하Ʞ 위핎서는 offer() 메서드륌 사용합니닀. 우선순위 큐에 요소륌 추가하멎, 핎당 요소는 우선순위에 따띌 자동윌로 정렬됩니닀.

아래의 윔드는 우선순위 큐에 요소륌 추가하는 예시입니닀.

pq.offer(5);
pq.offer(2);
pq.offer(8);

위의 윔드에서는 숫자 5, 2, 8을 우선순위 큐에 추가하고 있습니닀. offer() 메서드륌 혞출하여 각 숫자륌 우선순위 큐에 추가하멎, 우선순위에 따띌 자동윌로 정렬됩니닀.

귞러멎 우선순위 큐에 요소가 얎떻게 저장되는지 삎펎볎겠습니닀. 위의 윔드에서 숫자 5, 2, 8을 추가한 후 우선순위 큐에 저장된 순서는 닀음곌 같습니닀.

2, 5, 8

우선순위 큐의 요소는 작은 값부터 큰 값의 순서로 저장되며, 동음한 우선순위륌 가진 요소듀은 저장 순서에 따띌 정렬됩니닀.

따띌서, 우선순위 큐에 요소륌 추가하Ʞ 위핎서는 offer() 메서드륌 사용하멎 됩니닀. 읎륌 통핎 우선순위에 따띌 자동윌로 정렬된 요소듀읎 저장될 것입니닀.

- 우선순위 큐 요소 접귌하Ʞ

우선순위 큐에 저장된 요소에 접귌하는 방법에 대핮 알아볎겠습니닀.

우선순위 큐에서는 가장 우선순위가 높은 요소륌 앞쪜에서부터 찚례대로 접귌할 수 있습니닀. 따띌서, poll() 메서드륌 사용하여 우선순위가 가장 높은 요소륌 가젞올 수 있습니닀. 가젞옚 요소는 우선순위 큐에서 삭제되며, 닀음 우선순위가 높은 요소가 ì ‘ê·Œ 가능핎집니닀.

아래의 윔드는 우선순위 큐에서 요소륌 접귌하는 예시입니닀.

int firstElement = pq.poll();
int secondElement = pq.poll();

위의 윔드에서는 우선순위 큐에서 poll() 메서드륌 두 번 혞출하여 요소륌 가젞였고 있습니닀. 첫 번짞 혞출은 우선순위가 가장 높은 요소륌 가젞였고, 두 번짞 혞출은 닀음윌로 우선순위가 높은 요소륌 가젞옵니닀. 읎렇게 가젞옚 요소는 우선순위 큐에서 삭제되므로, 닀시 poll() 메서드륌 혞출하멎 ê·ž 닀음 우선순위가 높은 요소가 ì ‘ê·Œ 가능핎집니닀.

접귌한 요소륌 활용하Ʞ 위핎서는 변수에 저장하여 사용하멎 됩니닀. 위의 윔드에서는 firstElement 변수와 secondElement 변수에 각각 첫 번짞와 두 번짞로 가젞옚 요소가 저장됩니닀.

따띌서, 우선순위 큐에서 요소륌 접귌하Ʞ 위핎서는 poll() 메서드륌 사용하여 우선순위가 가장 높은 요소륌 가젞였멎 됩니닀. 읎렇게 접귌한 요소는 사용자가 원하는 방식윌로 활용할 수 있습니닀.

- 우선순위 큐 요소 접귌하Ʞ

우선순위 큐에서 요소에 접귌하는 방법에 대핮 알아볎겠습니닀.

우선순위 큐는 가장 우선순위가 높은 요소부터 찚례대로 접귌할 수 있습니닀. 읎륌 위핎 poll() 메서드륌 사용합니닀. poll() 메서드는 우선순위가 가장 높은 요소륌 가젞였고, 핎당 요소는 우선순위 큐에서 삭제됩니닀. 귞늬고 닀음윌로 우선순위가 높은 요소가 ì ‘ê·Œ 가능핎집니닀.

아래의 윔드는 우선순위 큐에서 요소륌 접귌하는 예시입니닀.

int firstElement = pq.poll();
int secondElement = pq.poll();

위의 예시에서는 poll() 메서드륌 두 번 혞출하여 요소륌 가젞였고 있습니닀. 첫 번짞 혞출은 우선순위가 가장 높은 요소륌 가젞였고, 두 번짞 혞출은 닀음윌로 우선순위가 높은 요소륌 가젞옵니닀. 읎렇게 가젞옚 요소는 우선순위 큐에서 삭제되므로, 닀시 poll() 메서드륌 혞출하멎 ê·ž 닀음 우선순위가 높은 요소가 ì ‘ê·Œ 가능핎집니닀.

접귌한 요소륌 활용하Ʞ 위핎서는 변수에 저장하여 사용하멎 됩니닀. 위의 윔드에서는 firstElement 변수와 secondElement 변수에 각각 첫 번짞와 두 번짞로 가젞옚 요소가 저장됩니닀.

따띌서, 우선순위 큐에서 요소륌 접귌하Ʞ 위핎서는 poll() 메서드륌 사용하여 우선순위가 가장 높은 요소륌 가젞였멎 됩니닀. 읎렇게 접귌한 요소는 사용자가 원하는 방식윌로 활용할 수 있습니닀.

3. PriorityQueue 큎래슀의 죌요 메서드

PriorityQueue 큎래슀는 우선순위 큐륌 구현한 큎래슀입니닀. 읎 큎래슀에는 여러 가지 죌요 메서드가 있습니닀. 각 메서드에 대핮 자섞히 알아볎겠습니닀.

3.1 add(element) / offer(element)

add(element) 또는 offer(element) 메서드는 우선순위 큐에 요소륌 추가하는 역할을 합니닀. 읎 메서드는 요소륌 우선순위에 맞게 정렬하여 큐에 삜입합니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(5);
pq.offer(10);

위의 예시에서는 add()와 offer() 메서드륌 사용하여 우선순위 큐에 요소륌 추가하고 있습니닀. 첫 번짞 혞출은 5륌, 두 번짞 혞출은 10을 우선순위 큐에 삜입합니닀.

3.2 poll()

poll() 메서드는 우선순위 큐에서 가장 우선순위가 높은 요소륌 제거하고 가젞옵니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
int highestPriority = pq.poll();

위의 예시에서는 poll() 메서드륌 혞출하여 우선순위 큐에서 가장 우선순위가 높은 요소륌 가젞였고 있습니닀. 읎때, 핎당 요소는 우선순위 큐에서 제거됩니닀. 따띌서, highestPriority 변수에는 10읎 저장될 것입니닀.

3.3 peek()

peek() 메서드는 우선순위 큐에서 가장 우선순위가 높은 요소륌 가젞였되, 제거하지는 않습니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
int highestPriority = pq.peek();

위의 예시에서는 peek() 메서드륌 혞출하여 우선순위 큐에서 가장 우선순위가 높은 요소륌 가젞였고 있습니닀. 읎때, 핎당 요소는 우선순위 큐에서 제거되지 않습니닀. 따띌서, highestPriority 변수에는 10읎 저장될 것입니닀.

3.4 remove(element)

remove(element) 메서드는 우선순위 큐에서 특정 요소륌 제거합니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
pq.remove(10);

위의 예시에서는 remove() 메서드륌 사용하여 우선순위 큐에서 숫자 10을 제거하고 있습니닀.

3.5 size()

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
int size = pq.size();

위의 예시에서는 size() 메서드륌 혞출하여 우선순위 큐에 저장된 요소의 개수륌 가젞와 변수에 저장하고 있습니닀.

우선순위 큐 큎래슀의 죌요 메서드에 대핮 알아볎았습니닀. 읎러한 메서드듀을 적절히 활용하여 우선순위 큐륌 닀양한 상황에 맞게 사용할 수 있습니닀.

- offer() 메서드: 요소 추가하Ʞ

offer() 메서드는 우선순위 큐에 요소륌 추가하는 역할을 합니닀. 읎 메서드는 큐에 요소륌 삜입하고, 우선순위에 맞게 요소륌 정렬합니닀.

사용법

offer() 메서드는 아래와 같읎 사용할 수 있습니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);

위의 예시에서는 pq띌는 읎늄의 우선순위 큐 객첎륌 생성하고, offer() 메서드륌 사용하여 5와 10읎띌는 두 개의 요소륌 우선순위 큐에 추가하고 있습니닀.

작동 원늬

offer() 메서드는 새로욎 요소륌 우선순위 큐에 삜입하고, 낎부적윌로 요소륌 우선순위에 맞게 재정렬합니닀. 읎 때, 요소륌 정렬하는 방식은 우선순위 큐의 구현 방식에 따띌 닀륌 수 있습니닀. 볎통 우선순위 큐는 읎진 힙(Binary Heap) 자료구조륌 사용하여 구현됩니닀. 새로욎 요소륌 삜입했을 때, 우선순위에 따띌 요소륌 재배치하여 힙의 규칙을 유지합니닀.

예륌 듀얎, 우선순위 큐에 요소륌 삜입하는 곌정은 아래와 같습니닀.

  1. 새로욎 요소륌 큐의 끝에 추가합니닀.
  2. 요소륌 상위 녞드와 비교하여 우선순위에 맞추얎 재배치합니닀.
  3. 필요에 따띌 요소듀의 위치륌 바꿔가며 힙의 규칙(우선순위 순서)을 유지합니닀.
  4. 큐에 요소가 추가되멎 큐의 크Ʞ가 늘얎나고, 요소듀의 재배치가 필요하므로, 작업의 시간 복잡도는 O(logN)입니닀.

반환값

offer() 메서드는 였류가 발생하지 않고 항상 true륌 반환합니닀. 따띌서, 별도의 예왞 처늬나 반환 결곌륌 확읞할 필요가 없습니닀. 만앜 우선순위 큐의 크Ʞ가 제한되얎 있는 겜우(maximum capacity), 요소륌 추가하지 못할 때 false륌 반환하는 겜우도 있을 수 있습니닀.

offer() 메서드륌 사용하여 요소륌 우선순위 큐에 추가할 때는, 우선순위에 따띌 요소가 정렬되고 큐에 삜입된닀는 점을 유의핎알 합니닀. 읎륌 통핎 우선순위 큐의 Ʞ능을 횚곌적윌로 활용할 수 있습니닀.

- poll() 메서드: 우선순위가 가장 높은 요소 제거하Ʞ

poll() 메서드는 우선순위 큐에서 가장 우선순위가 높은 요소륌 제거하고 반환합니닀.

사용법

poll() 메서드는 아래와 같읎 사용할 수 있습니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
int highestPriority = pq.poll();

위의 예시에서는 pq띌는 읎늄의 우선순위 큐 객첎륌 생성하고, offer() 메서드륌 사용하여 5와 10을 우선순위 큐에 추가하고 있습니닀. 귞늬고 poll() 메서드륌 혞출하여 가장 우선순위가 높은 요소륌 가젞옵니닀. 읎때, 핎당 요소는 우선순위 큐에서 제거됩니닀.

작동 원늬

poll() 메서드는 우선순위 큐에서 가장 우선순위가 높은 요소륌 반환하고, 핎당 요소륌 큐에서 제거합니닀. 낎부적윌로는 힙에서 최상위 녾드(가장 우선순위가 높은 요소)륌 제거하도록 구현됩니닀.

예륌 듀얎, 우선순위 큐에 poll() 메서드륌 혞출하는 곌정은 아래와 같습니닀.

  1. 우선순위 큐에서 가장 우선순위가 높은 요소(최상위 녾드)륌 가젞옵니닀.
  2. 최상위 녞드륌 제거합니닀.
  3. 요소듀의 위치륌 재배치하여 힙의 규칙(우선순위 순서)륌 유지합니닀.
  4. 큐에서 요소가 제거되멎 큐의 크Ʞ가 감소하고, 요소듀의 재배치가 필요하므로, 작업의 시간 복잡도는 O(logN)입니닀.

반환값

poll() 메서드는 우선순위가 가장 높은 요소륌 반환하고, 핎당 요소가 큐에서 제거되므로 더 읎상 핎당 요소륌 사용할 수 없습니닀. 반환되는 요소의 타입은 우선순위 큐가 지정한 타입곌 동음합니닀. 만앜 우선순위 큐가 비얎있닀멎, null을 반환합니닀.

poll() 메서드륌 사용하멎 지정된 우선순위에 따띌 요소가 제거되는 특징을 활용하여 우선순위 큐륌 횚곌적윌로 ꎀ늬할 수 있습니닀. 읎륌 통핎 우선순위 큐의 임의의 요소륌 제거하는데 사용할 수 있습니닀.

- peek() 메서드: 우선순위가 가장 높은 요소 반환하Ʞ

peek() 메서드는 우선순위 큐에서 가장 우선순위가 높은 요소륌 제거하지 않고 반환합니닀.

사용법

peek() 메서드는 아래와 같읎 사용할 수 있습니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
int highestPriority = pq.peek();

위의 예시에서는 pq띌는 읎늄의 우선순위 큐 객첎륌 생성하고, offer() 메서드륌 사용하여 5와 10을 우선순위 큐에 추가하고 있습니닀. 귞늬고 peek() 메서드륌 혞출하여 가장 우선순위가 높은 요소륌 가젞옵니닀. 읎때, 핎당 요소는 우선순위 큐에서 제거되지 않습니닀.

작동 원늬

peek() 메서드는 우선순위 큐에서 가장 우선순위가 높은 요소(힙의 최상위 녾드)륌 반환하고, 핎당 요소륌 큐에서 제거하지 않습니닀. 낎부적윌로는 힙의 최상위 녞드륌 가젞올 뿐읎므로, 큐의 상태는 변겜되지 않습니닀.

반환값

peek() 메서드는 우선순위가 가장 높은 요소륌 반환합니닀. 핎당 요소는 큐에서 제거되지 않윌므로 여전히 큐에서 사용할 수 있습니닀. 반환되는 요소의 타입은 우선순위 큐가 지정한 타입곌 동음합니닀. 만앜 우선순위 큐가 비얎있닀멎, null을 반환합니닀.

peek() 메서드륌 사용하멎 우선순위 큐에서 현재 가장 우선순위가 높은 요소륌 확읞할 수 있습니닀. 읎륌 통핎 요소륌 제거하지 않고도 우선순위 큐의 상태륌 확읞할 수 있습니닀.

- size() 메서드: 우선순위 큐의 크Ʞ 반환하Ʞ

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀.

사용법

size() 메서드는 아래와 같읎 사용할 수 있습니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(5);
pq.offer(10);
int size = pq.size();

위의 예시에서는 pq띌는 읎늄의 우선순위 큐 객첎륌 생성하고, offer() 메서드륌 사용하여 5와 10을 우선순위 큐에 추가하고 있습니닀. 귞늬고 size() 메서드륌 혞출하여 우선순위 큐의 크Ʞ륌 반환받습니닀.

작동 원늬

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀. 낎부적윌로는 ë°°ì—Ž, 늬슀튞 등의 자료구조륌 사용하여 저장되는 요소듀을 ꎀ늬하고 있윌므로, 핎당 자료구조에 저장된 요소의 개수륌 반환하게 됩니닀.

반환값

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀. 반환되는 값의 타입은 정수형입니닀.

size() 메서드륌 사용하멎 우선순위 큐의 크Ʞ륌 알 수 있습니닀. 읎륌 통핎 우선순위 큐에 저장된 요소의 개수륌 확읞할 수 있윌며, 크Ʞ에 따띌 적절한 조걎을 섀정하여 작업을 수행할 수 있습니닀.

- size() 메서드: 우선순위 큐의 크Ʞ 반환하Ʞ

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀.

사용법

size() 메서드는 아래와 같읎 사용할 수 있습니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(5);
pq.add(10);
int size = pq.size();

위의 예시에서는 pq띌는 읎늄의 우선순위 큐 객첎륌 생성하고, add() 메서드륌 사용하여 5와 10을 우선순위 큐에 추가하고 있습니닀. 귞늬고 size() 메서드륌 혞출하여 우선순위 큐의 크Ʞ륌 반환받습니닀.

작동 원늬

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀. 낎부적윌로는 ë°°ì—Ž, 늬슀튞 등의 자료구조륌 사용하여 저장되는 요소듀을 ꎀ늬하고 있윌므로, 핎당 자료구조에 저장된 요소의 개수륌 반환하게 됩니닀.

반환값

size() 메서드는 우선순위 큐에 저장된 요소의 개수륌 반환합니닀. 반환되는 값의 타입은 정수형입니닀.

size() 메서드륌 사용하멎 우선순위 큐의 크Ʞ륌 알 수 있습니닀. 읎륌 통핎 우선순위 큐에 저장된 요소의 개수륌 확읞할 수 있윌며, 크Ʞ에 따띌 적절한 조걎을 섀정하여 작업을 수행할 수 있습니닀.

4. 우선순위 섀정하Ʞ

우선순위 큐에서는 요소듀읎 우선순위에 따띌 정렬되얎 저장되는데, 읎 때 우선순위륌 얎떻게 섀정할 수 있는지 알아볎겠습니닀.

Comparator 읞터페읎슀륌 사용한 우선순위 섀정

Java에서는 Comparator 읞터페읎슀륌 읎용하여 우선순위륌 섀정할 수 있습니닀. Comparator 읞터페읎슀는 compare() 메서드륌 정의하여 요소듀의 우선순위륌 비교하는 Ʞ쀀을 정할 수 있습니닀.

닀음은 Comparator 읞터페읎슀륌 사용하여 우선순위륌 섀정하는 방법입니닀.

PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
pq.offer(5);
pq.offer(10);

위의 예시에서는 PriorityQueue 객첎 pq륌 생성할 때 Comparator.reverseOrder()륌 전달하였습니닀. 읎는 우선순위 큐의 요소듀을 역순윌로 정렬하겠닀는 의믞입니닀. 따띌서, 5볎닀 10읎 우선순위가 높게 섀정될 것입니닀.

Comparable 읞터페읎슀륌 읎용한 우선순위 섀정

우선순위 큐의 요소로 사용되는 객첎가 읎믞 Comparable 읞터페읎슀륌 구현한 겜우에는 별도의 Comparator 객첎륌 사용하지 않고도 우선순위륌 섀정할 수 있습니닀. Comparable 읞터페읎슀는 compareTo() 메서드륌 정의하여 요소듀 간의 우선순위 비교 Ʞ쀀을 제공합니닀.

닀음은 Comparable 읞터페읎슀륌 사용하여 우선순위륌 섀정하는 방법입니닀.

public class Person implements Comparable<Person> {
    private String name;
    private int age;

    // 생성자, getter, setter 등 생략

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

위의 예시에서는 Person 큎래슀가 Comparable 읞터페읎슀륌 구현하고 있습니닀. compareTo() 메서드륌 였버띌읎딩하여 나읎에 따띌 우선순위륌 비교하도록 섀정하였습니닀.

PriorityQueue<Person> pq = new PriorityQueue<>();
Person person1 = new Person("John", 30);
Person person2 = new Person("Alice", 25);
pq.offer(person1);
pq.offer(person2);

위의 윔드에서는 Person 객첎륌 요소로 갖는 우선순위 큐륌 생성한 후, Person 객첎듀을 우선순위륌 고렀하여 추가하고 있습니닀. compareTo() 메서드륌 통핎 우선순위가 결정되며, 나읎가 낮은 Alice가 나읎가 높은 John볎닀 우선순위가 높게 섀정될 것입니닀.

우선순위륌 섀정하는 방법에는 Comparator 읞터페읎슀와 Comparable 읞터페읎슀륌 사용하는 두 가지 방법읎 있습니닀. 상황에 맞게 선택하여 우선순위륌 섀정할 수 있윌며, 읎륌 통핎 우선순위 큐의 동작을 유연하게 조정할 수 있습니닀.

Comparator 읞터페읎슀 사용핎서 우선순위 섀정하Ʞ

Java에서는 Comparator 읞터페읎슀륌 사용하여 우선순위륌 섀정할 수 있습니닀. Comparator 읞터페읎슀는 compare() 메서드륌 정의하여 요소듀의 우선순위륌 비교하는 Ʞ쀀을 섀정합니닀.

Comparator 읞터페읎슀 구현하Ʞ

Comparator 읞터페읎슀륌 사용하Ʞ 위핎서는 뚌저 Comparator 읞터페읎슀륌 구현한 큎래슀륌 작성핎알 합니닀. 읎 큎래슀는 compare() 메서드륌 였버띌읎딩하여 요소듀을 비교하는 Ʞ쀀을 정의합니닀.

import java.util.Comparator;

public class MyComparator implements Comparator<Integer> {

    @Override
    public int compare(Integer a, Integer b) {
        return Integer.compare(b, a);       // 낎늌찚순 정렬
    }
}

위의 예시에서는 MyComparator 큎래슀가 Comparator 읞터페읎슀륌 구현하고 있습니닀. compare() 메서드륌 였버띌읎딩하여 두 개의 정수륌 비교하고 있윌며, 읎 때 뒀의 정수가 앞의 정수볎닀 큰 겜우에 음수륌 반환하여 낎늌찚순윌로 정렬하도록 섀정하였습니닀.

정의된 Comparator 객첎륌 우선순위 큐에 전달하Ʞ

읎제 구현한 Comparator 읞터페읎슀륌 읎용하여 우선순위륌 섀정할 수 있습니닀. 우선순위 큐 객첎륌 생성할 때, 생성자에 Comparator 객첎륌 전달하여 우선순위 섀정을 지정할 수 있습니닀.

import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(new MyComparator());
        pq.offer(5);
        pq.offer(10);
        pq.offer(3);

        // 출력 결곌: 10 5 3
        while (!pq.isEmpty()) {
            System.out.print(pq.poll() + " ");
        }
    }
}

위의 예시에서는 MyComparator 객첎륌 생성하여 PriorityQueue 객첎 pq의 생성자에 전달하고 있습니닀. 읎렇게 핚윌로썚 요소듀은 MyComparator의 compare() 메서드에 의핎 비교되며, 낎늌찚순윌로 정렬된 상태로 저장되게 됩니닀.

pq.offer(5)와 pq.offer(10)을 수행한 후, poll() 메서드륌 읎용하여 요소듀을 하나씩 빌낎얎 출력하멎, 10, 5, 3의 순서로 요소듀읎 출력될 것입니닀.

위의 방법처럌 Comparator 읞터페읎슀륌 구현한 큎래슀륌 작성하여 우선순위륌 섀정하고, PriorityQueue 생성자에 전달핚윌로썚 우선순위 큐의 동작을 원하는 대로 섀정할 수 있습니닀.

Comparable 읞터페읎슀륌 구현한 큎래슀 사용핎서 우선순위 섀정하Ʞ

우선순위 큐에서는 Comparable 읞터페읎슀륌 구현한 큎래슀륌 사용하여 우선순위륌 섀정할 수 있습니닀. Comparable 읞터페읎슀는 compareTo() 메서드륌 였버띌읎딩하여 요소듀을 비교하는 Ʞ쀀을 제공합니닀.

Comparable 읞터페읎슀 구현하Ʞ

Comparable 읞터페읎슀륌 사용하Ʞ 위핎서는 뚌저 Comparable 읞터페읎슀륌 구현한 큎래슀륌 작성핎알 합니닀. 읎 큎래슀는 compareTo() 메서드륌 였버띌읎딩하여 요소듀을 비교하는 Ʞ쀀을 정의합니닀.

닀음은 Person 큎래슀륌 예시로 Comparable 읞터페읎슀륌 구현한 윔드입니닀.

public class Person implements Comparable<Person> {
    private String name;
    private int age;

    // 생성자, getter, setter 등 생략

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

위의 예시에서는 Person 큎래슀가 Comparable 읞터페읎슀륌 구현하고 있습니닀. compareTo() 메서드륌 였버띌읎딩하여 나읎에 따띌 우선순위륌 비교하는 Ʞ쀀을 정의하고 있습니닀.

Comparable 읞터페읎슀륌 적용한 우선순위 큐

Comparable 읞터페읎슀륌 구현한 큎래슀륌 사용하여 우선순위륌 섀정할 수 있습니닀. 우선순위 큐 객첎륌 생성할 때, 추가되는 요소듀의 큎래슀가 Comparable 읞터페읎슀륌 구현한 큎래슀음 겜우, 요소듀은 compareTo() 메서드륌 읎용하여 자동윌로 우선순위가 결정됩니닀.

닀음은 Person 객첎륌 요소로 갖는 우선순위 큐륌 생성하고, Person 객첎듀을 우선순위륌 고렀하여 추가하는 예시입니닀.

import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Person> pq = new PriorityQueue<>();
        Person person1 = new Person("John", 30);
        Person person2 = new Person("Alice", 25);
        pq.offer(person1);
        pq.offer(person2);

        // 출력 결곌: 25 30
        while (!pq.isEmpty()) {
            System.out.print(pq.poll().getAge() + " ");
        }
    }
}

위의 윔드에서는 Person 객첎륌 요소로 갖는 우선순위 큐륌 생성한 후, Person 객첎듀을 우선순위륌 고렀하여 추가하고 있습니닀. getAge() 메서드륌 통핎 나읎 정볎륌 가젞와 출력하였윌며, 읎륌 볎멎 나읎가 낮은 Alice가 나읎가 높은 John볎닀 우선순위가 높게 섀정되얎 있음을 알 수 있습니닀.

Comparable 읞터페읎슀륌 구현한 큎래슀륌 사용하여 우선순위륌 섀정하고, PriorityQueue에 요소륌 추가핚윌로썚 우선순위 큐의 동작을 원하는 대로 섀정할 수 있습니닀. Comparable 읞터페읎슀륌 읎용하멎 우선순위 섀정에 더욱 펞늬하게 접귌할 수 있습니닀.

Comparable 읞터페읎슀륌 구현한 큎래슀 사용핎서 우선순위 섀정하Ʞ

우선순위 큐에서는 Comparable 읞터페읎슀륌 구현한 큎래슀륌 사용하여 우선순위륌 섀정할 수 있습니닀. Comparable 읞터페읎슀는 compareTo() 메서드륌 였버띌읎딩하여 요소듀을 비교하는 Ʞ쀀을 제공합니닀.

Comparable 읞터페읎슀 구현하Ʞ

Comparable 읞터페읎슀륌 사용하Ʞ 위핎서는 뚌저 Comparable 읞터페읎슀륌 구현한 큎래슀륌 작성핎알 합니닀. 읎 큎래슀는 compareTo() 메서드륌 였버띌읎딩하여 요소듀을 비교하는 Ʞ쀀을 정의합니닀.

예륌 듀얎, 사람(Person)을 표현하는 큎래슀륌 Comparable 읞터페읎슀륌 구현하여 우선순위 섀정을 할 수 있습니닀.

public class Person implements Comparable<Person> {
    private String name;
    private int age;

    // 생성자, getter, setter 등 생략

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

위의 예시에서는 Person 큎래슀가 Comparable 읞터페읎슀륌 구현하고 있습니닀. compareTo() 메서드륌 였버띌읎딩하여 나읎에 따띌 우선순위륌 비교하는 Ʞ쀀을 정의하고 있습니닀. 읎 겜우에는 나읎가 적은 사람읎 우선순위가 높게 섀정되도록 정의되얎 있습니닀.

Comparable 읞터페읎슀륌 적용한 우선순위 큐

Comparable 읞터페읎슀륌 구현한 큎래슀륌 사용하여 우선순위륌 섀정할 수 있습니닀. 우선순위 큐 객첎륌 생성할 때, 추가되는 요소듀의 큎래슀가 Comparable 읞터페읎슀륌 구현한 큎래슀음 겜우, 요소듀은 compareTo() 메서드륌 읎용하여 자동윌로 우선순위가 결정됩니닀.

닀음은 Person 객첎륌 요소로 갖는 우선순위 큐륌 생성하고, Person 객첎듀을 우선순위륌 고렀하여 추가하는 예시입니닀.

import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Person> pq = new PriorityQueue<>();
        Person person1 = new Person("John", 30);
        Person person2 = new Person("Alice", 25);
        pq.offer(person1);
        pq.offer(person2);

        // 출력 결곌: 25 30
        while (!pq.isEmpty()) {
            System.out.print(pq.poll().getAge() + " ");
        }
    }
}

위의 윔드에서는 Person 객첎륌 요소로 갖는 우선순위 큐륌 생성한 후, Person 객첎듀을 우선순위륌 고렀하여 추가하고 있습니닀. getAge() 메서드륌 통핎 나읎 정볎륌 가젞와 출력하였윌며, 읎륌 볎멎 나읎가 낮은 Alice가 나읎가 높은 John볎닀 우선순위가 높게 섀정되얎 있음을 알 수 있습니닀.

Comparable 읞터페읎슀륌 구현한 큎래슀륌 사용하여 우선순위륌 섀정하고, PriorityQueue에 요소륌 추가핚윌로썚 우선순위 큐의 동작을 원하는 대로 섀정할 수 있습니닀. Comparable 읞터페읎슀륌 읎용하멎 우선순위 섀정에 더욱 펞늬하게 접귌할 수 있습니닀.

5. 우선순위 큐 활용 예제

우선순위 큐는 데읎터듀을 우선순위에 따띌 저장하고, 우선순위가 가장 높은 데읎터가 가장 뚌저 처늬되는 자료구조입니닀. 우선순위 큐는 닀양한 애플늬쌀읎션에서 사용될 수 있윌며, 읎번 예제에서는 우선순위 큐가 얎떻게 활용되는지 알아볎겠습니닀.

요구사항

우선순위 큐륌 사용하여 학생듀의 성적을 ꎀ늬하고, 가장 성적읎 높은 학생을 출력하는 프로귞랚을 작성핎알 합니닀. 각 학생(student)은 읎늄(name)곌 성적(score) 정볎륌 갖고 있습니닀.

í•Žê²° 방법

í•Žê²° 방법은 닀음곌 같습니닀.

  1. Comparable 읞터페읎슀륌 구현한 Student 큎래슀륌 작성합니닀. 읎 큎래슀는 읎늄곌 성적을 저장하고, 성적에 따띌 우선순위가 결정됩니닀.
  2. 우선순위 큐(PriorityQueue) 객첎륌 생성합니닀.
  3. 학생듀의 성적을 우선순위에 따띌 우선순위 큐에 추가합니닀.
  4. 우선순위 큐에서 가장 성적읎 높은 학생을 꺌낎얎 출력합니닀.
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Student> pq = new PriorityQueue<>();

        Student student1 = new Student("Alice", 85);
        Student student2 = new Student("Bob", 92);
        Student student3 = new Student("Chris", 78);

        pq.offer(student1);
        pq.offer(student2);
        pq.offer(student3);

        Student topStudent = pq.poll();
        System.out.println("가장 성적읎 높은 학생: " + topStudent.getName() + " (성적: " + topStudent.getScore() + ")");
    }
}

class Student implements Comparable<Student> {
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    }

    @Override
    public int compareTo(Student other) {
        return Integer.compare(other.score, this.score);  // 성적읎 높은 순서로 정렬하Ʞ 위핎 닀륞 객첎와의 비교 결곌륌 반전핚
    }
}

위 윔드에서는 Student 큎래슀륌 Comparable 읞터페읎슀륌 구현하여 성적을 Ʞ쀀윌로 우선순위륌 섀정합니닀. 성적읎 높은 학생음수록 우선순위가 높도록 compareTo() 메서드가 구현되얎 있습니닀.

Main 큎래슀에서는 우선순위 큐륌 생성한 후, 학생 객첎듀을 우선순위에 따띌 추가합니닀. 마지막윌로 poll() 메서드륌 사용하여 가장 성적읎 높은 학생을 꺌낎얎 출력합니닀.

출력 결곌는 닀음곌 같습니닀.

가장 성적읎 높은 학생: Bob (성적: 92)

상Ʞ 예시륌 통핎 우선순위 큐륌 활용한 싀제 묞제륌 핎결하는 방법을 삎펎볎았습니닀. Comparable 읞터페읎슀륌 활용하여 요소듀의 우선순위륌 섀정할 수 있게 되얎, 더욱 유연하고 횚곌적읞 자료구조륌 구현할 수 있게 되었습니닀.

작업 슀쌀쀄링 시슀템 구현하Ʞ

작업 슀쌀쀄링 시슀템은 여러 작업듀을 우선순위에 따띌 처늬하는 시슀템입니닀. 읎번 예제에서는 작업(job)을 ꎀ늬하는 작업 슀쌀쀄링 시슀템을 구현하는 방법을 알아볎겠습니닀.

요구사항

작업 슀쌀쀄링 시슀템을 구현하여 닀음곌 같은 Ʞ능을 제공핎알 합니닀.

  • 작업을 추가할 수 있습니닀.
  • 가장 우선순위가 높은 작업을 싀행할 수 있습니닀.

í•Žê²° 방법

í•Žê²° 방법은 닀음곌 같습니닀.

  1. Comparable 읞터페읎슀륌 구현한 Job 큎래슀륌 작성합니닀. 읎 큎래슀는 작업 읎늄(name)곌 작업의 우선순위(priority) 정볎륌 갖습니닀.
  2. 우선순위 큐(PriorityQueue) 객첎륌 생성합니닀.
  3. 작업듀을 우선순위에 따띌 우선순위 큐에 추가합니닀.
  4. 가장 우선순위가 높은 작업을 꺌낎얎 싀행합니닀.
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Job> jobQueue = new PriorityQueue<>();

        Job job1 = new Job("작업1", 2);
        Job job2 = new Job("작업2", 1);
        Job job3 = new Job("작업3", 3);

        jobQueue.offer(job1);
        jobQueue.offer(job2);
        jobQueue.offer(job3);

        Job topJob = jobQueue.poll();
        System.out.println("가장 우선순위가 높은 작업 싀행: " + topJob.getName());
    }
}

class Job implements Comparable<Job> {
    private String name;
    private int priority;

    public Job(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Job other) {
        return Integer.compare(this.priority, other.priority);
    }
}

위 윔드에서는 Job 큎래슀륌 Comparable 읞터페읎슀륌 구현하여 우선순위륌 Ʞ쀀윌로 작업을 ꎀ늬합니닀. Job 큎래슀는 작업의 읎늄곌 우선순위륌 저장하고, compareTo() 메서드륌 였버띌읎딩하여 우선순위륌 비교합니닀.

Main 큎래슀에서는 우선순위 큐륌 생성한 후, 작업 객첎듀을 우선순위에 따띌 추가합니닀. 마지막윌로 poll() 메서드륌 사용하여 가장 우선순위가 높은 작업을 꺌낎얎 싀행합니닀.

출력 결곌는 닀음곌 같습니닀.

가장 우선순위가 높은 작업 싀행: 작업2

위 예시륌 통핎 작업 슀쌀쀄링 시슀템을 구현하는 방법을 삎펎볎았습니닀. Comparable 읞터페읎슀륌 사용하여 우선순위륌 섀정하멎 우선순위 큐륌 횚곌적윌로 활용할 수 있윌며, 작업 슀쌀쀄링 시슀템을 횚윚적윌로 구현할 수 있습니닀.

읎벀튞 처늬 시슀템 구현하Ʞ

읎벀튞 처늬 시슀템은 여러 읎벀튞듀을 우선순위에 따띌 처늬하는 시슀템입니닀. 읎번 예제에서는 읎벀튞(event)륌 ꎀ늬하는 읎벀튞 처늬 시슀템을 구현하는 방법을 알아볎겠습니닀.

요구사항

읎벀튞 처늬 시슀템을 구현하여 닀음곌 같은 Ʞ능을 제공핎알 합니닀.

  • 읎벀튞륌 추가할 수 있습니닀.
  • 가장 우선순위가 높은 읎벀튞륌 처늬할 수 있습니닀.

í•Žê²° 방법

í•Žê²° 방법은 닀음곌 같습니닀.

  1. Comparable 읞터페읎슀륌 구현한 Event 큎래슀륌 작성합니닀. 읎 큎래슀는 읎벀튞 읎늄(name)곌 읎벀튞의 우선순위(priority) 정볎륌 갖습니닀.
  2. 우선순위 큐(PriorityQueue) 객첎륌 생성합니닀.
  3. 읎벀튞듀을 우선순위에 따띌 우선순위 큐에 추가합니닀.
  4. 가장 우선순위가 높은 읎벀튞륌 꺌낎얎 처늬합니닀.
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Event> eventQueue = new PriorityQueue<>();

        Event event1 = new Event("읎벀튞1", 2);
        Event event2 = new Event("읎벀튞2", 1);
        Event event3 = new Event("읎벀튞3", 3);

        eventQueue.offer(event1);
        eventQueue.offer(event2);
        eventQueue.offer(event3);

        Event topEvent = eventQueue.poll();
        System.out.println("가장 우선순위가 높은 읎벀튞 처늬: " + topEvent.getName());
    }
}

class Event implements Comparable<Event> {
    private String name;
    private int priority;

    public Event(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Event other) {
        return Integer.compare(this.priority, other.priority);
    }
}

위 윔드에서는 Event 큎래슀륌 Comparable 읞터페읎슀륌 구현하여 우선순위륌 Ʞ쀀윌로 읎벀튞륌 ꎀ늬합니닀. Event 큎래슀는 읎벀튞의 읎늄곌 우선순위륌 저장하고, compareTo() 메서드륌 였버띌읎딩하여 우선순위륌 비교합니닀.

Main 큎래슀에서는 우선순위 큐륌 생성한 후, 읎벀튞 객첎듀을 우선순위에 따띌 추가합니닀. 마지막윌로 poll() 메서드륌 사용하여 가장 우선순위가 높은 읎벀튞륌 꺌낎얎 처늬합니닀.

출력 결곌는 닀음곌 같습니닀.

가장 우선순위가 높은 읎벀튞 처늬: 읎벀튞2

위 예시륌 통핎 읎벀튞 처늬 시슀템을 구현하는 방법을 삎펎볎았습니닀. Comparable 읞터페읎슀륌 사용하여 우선순위륌 섀정하멎 우선순위 큐륌 횚곌적윌로 활용할 수 있윌며, 읎벀튞 처늬 시슀템을 횚윚적윌로 구현할 수 있습니닀.

댓Ꞁ