우선순위 큐 (Priority Queue)
우선순위 큐 (Priority Queue)
큐 (Queue))
큐(Queue)는 먼저 들어오는 데이터가 먼저 나가는 FIFO(First In First Out)
형식의 자료구조입니다.
우선순위 큐 (Priority Queue)
우선순위 큐(Priority Queue)는 먼저 들어오는 데이터가 아니라, 우선순위가 높은 데이터
가 먼저 나가는 형태의 자료구조입니다. 우선순위 큐는 일반적으로 힙(Heap)
을 이용하여 구현합니다.
우선순위 큐는 리스트와 연결리스트로 구현 가능합니다.
하지만 리스트
의 경우 data가 많아 질 경우 데이터를 우선순위에 기반해 전체 비교를 거쳐 알맞은 자리를 찾고, 그 자리에 넣기 위해 전체 자료를 밀어내야합니다.
연결리스트
의 경우 또한 data가 많아 질 경우 노드간의 연결을 거쳐 모든 노드에 접근하여 비교연산을 해야합니다. 이는 비용이 매우 크기 때문에 일반적으로 우선순위 큐는 Heap을 가지고 구현합니다.
힙 (Heap)
힙(Heap)은 우선순위 큐를 위해 고안된 완전이진트리
형태의 자료구조입니다.
여러 개의 값 중 최댓값 또는 최솟값을 찾아내는 연산이 빠릅니다.
완전이진트리?
- 완전 이진트리는 마지막 레벨을 제외 하고 모든 레벨이 완전히 채워져 있다.
- 마지막 레벨은 꽉 차 있지 않아도 되지만, 노드가 왼쪽에서 오른쪽으로 채워져야 한다.
- 마지막 레벨 h에서 1~2h-1 개의 노드를 가질 수 있다.
- 완전 이진 트리는 배열을 사용해 효율적으로 표현 가능하다.
힙의 종류는 최대 힙
과 최소 힙
이 두가지가 존재합니다.
최대 힙
최대 힙이란, 부모 노드의 값 > 자식 노드의 값인 힙을 최대 힙이라고 합니다.
최소 힙
최소 힙이란 자식 노드의 값 > 부모 노드의 값인 힙을 최소 힙이라고 합니다.
우선순위큐 JAVA
1 | // Priority Queue 선언 |
Priority Queue API
- | 예외 발생 | 값 리턴 |
---|---|---|
추가(enquene) | add(element e) | offer(element e) |
삭제(dequene) | remove() | poll() |
검사(peek) | element() | peek() |
예외발생에 있는 API는 예외를 발생하지만 값 리턴 영역에 있는 API는 true/false 값을 리턴합니다.
예시 문제
더 맵게
문제
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
제한 사항
- scoville의 길이는 2 이상 1,000,000 이하입니다.
- K는 0 이상 1,000,000,000 이하입니다.
- scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
- 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
입출력 예
scoville | K | return |
---|---|---|
[1, 2, 3, 9, 10, 12] | 7 | 2 |
답안
1 | import java.util.PriorityQueue; |