728x90
반응형
[문제]
주어진 정수 배열에서 k번째로 높은 점수를 찾는 문제로 새로운 점수가 추가될 때마다 k번째로 높은 점수를 반환해야 한다
ex.
입력:
["KthLargest", "add", "add", "add", "add"]
[[4, [7, 7, 7, 7, 8, 3]], [2], [10], [9], [9]]
출력 : [null, 7, 7, 7, 8]
[풀이]
import java.util.PriorityQueue;
class KthLargest {
public PriorityQueue<Integer> queue;
public int k;
public KthLargest(int k, int[] nums) {
//초기화 하기
this.k = k;
queue = new PriorityQueue<>();
for(int i=0;i<nums.length;i++){
add(nums[i]);
}
}
public int add(int val) {
queue.offer(val);
if(queue.size()>k){ //k보다 사이즈 크면 값 빼기
queue.poll();
}
return queue.peek();
}
}
[개념 정리]
1. 우선순위 큐(Priority Queue)와 힙(Heap)
우선순위 큐(Priority Queue)
- 들어간 순서에 상관없이 일정한 규칙에 따라 우선순위를 선정하고 우선순위가 가장 높은 데이터가 먼저 나오는 자료구조.
- 모든 항목에는 우선순위가 있으며, 우선순위가 높은 요소는 낮은 요소보다 먼저 Queue에서 제외된다.
- 두 요소의 우선순위가 같으면 Queue의 순서에 따라 제공된다.
- 대표적인 구현 방식으로 힙(Heap)을 이용한다.
힙(Heap)
- 이진 힙(bnary heap)이라고도 하며, 최댓값 및 최솟값을 찾아내기 위한 완전 이진 트리 형태로 만들어진 자료구조이다.
* 최대힙(Max Heap): 부모 노드의 값은 항상 자식 노드의 값보다 크거나 같을 때. 루트 노드 = 트리의 최댓값
* 최소힙(Min Heap): 부모 노드의 값은 항상 자식노드보다 작거나 같을 때. 루트 노드 = 트리의 최솟값
- 이를 통해 최댓값과 최솟값을 빠르게 찾아낼 수있으며, 삽입, 삭제 연산시에도 부모 노드가 자식 노드보다 우선순위만 높으면 되므로 결국 트리의 깊이만큼만 비교하면 되기 때문에 빠르게 수행 가능하다.
3) 우선순위 큐 선언
// 기본적으로 낮은 수가 우선순위를 가짐
PriorityQueue<Integer> queue = new PriorityQueue<>();
// 높은 수가 우선순위를 가지려면 Collections.reverseOrder() 사용
PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
// 문자 > 알파벳 순으로 더 빨리오는 문자열이 우선순위를 가짐
PriorityQueue<String> queue = new PriorityQueue<>();
4) 우선순위 큐 메서드
public boolean add(E e) // 삽입 (성공 시 true / 실패 시 IllegalstateException 발생)
public E element() // 삭제 없이 요소 읽어옴(peek()과 달리 비었을 때 NoSuchElementException 발생)
public boolean offer(E e) // 객체 저장(성공 시 true / 실패 시 false)
public E peek() // 삭제 없이 요소 읽어옴(비어있을 시 null 반환)
public E poll() // 객체 꺼내서 반환(비어있을 시 null 반환)
public boolean remove(Object o) // 객체 꺼내서 반환(비어있을 시 NoSuchElementException 발생)
public boolean contains(Object o) // 찾고자하는 요소 있는지 확인할 때
size() // 큐에 있는 요소 개수 반환
isEmpty() // 비어있는지 확인
출처: https://leetcode.com/problems/kth-largest-element-in-a-stream/description/
728x90
반응형
'복습' 카테고리의 다른 글
[코딩테스트 - 12일차] 문자열 내림차순으로 배치하기 (0) | 2024.09.02 |
---|---|
[코딩테스트 - 11일차] 정수 내림차순으로 배치하기 (0) | 2024.09.02 |
[코딩테스트 - 9일차] 상대적 순위 (0) | 2024.08.30 |
[코딩테스트 - 8일차] 올바른 괄호 찾기 (0) | 2024.08.19 |
[코딩테스트 - 7일차] 같은 숫자는 싫어 (스택/큐) (0) | 2024.08.19 |