제한사항
- 3 ≤ k ≤ 100
- 7 ≤ score의 길이 ≤ 1,000
- 0 ≤ score[i] ≤ 2,000
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
int[] fame = new int[k];
if(k > score.length) {
for(int i = 0; i < score.length; i++){
fame[i] = score[i];
reverseSort(fame);
answer[i] = fame[i];
}
} else {
for(int i = 0; i < k; i++) {
fame[i] = score[i];
reverseSort(fame);
answer[i] = fame[i];
}
for(int i = k; i < score.length; i++) {
if(fame[k-1] >= score[i]) {
answer[i] = fame[k-1];
} else {
fame[k-1] = score[i];
reverseSort(fame);
answer[i] = fame[k-1];
}
}
}
return answer;
}
public static void reverseSort(int[] arr) {
Arrays.sort(arr);
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
}
}
처음에 9, 11번 테스트에서 계속 런타임 에러가 떴다.
k 가 score 의길이보다 클 경우를 빠뜨린 것.
해당하는 조건식으로 코드를 감싸주었다.
조건식을 잘 보자! 이번 경우 각 인자들의 크기를 특히 잘 보자!
PriorityQueue(우선 순위 큐)를 사용한 풀이가 많이 보였다. PriorityQueue의 특징은 다음과 같다.
PriorityQueue의 선언은 아래와 같다.
- 낮은 숫자가 우선 순위인 int 형 우선순위 큐 선언
PriorityQueue priorityQueueLowest = new PriorityQueue<>();- 높은 숫자가 우선 순위인 int 형 우선순위 큐 선언
PriorityQueue priorityQueueHighest = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue를 사용한 코드는 다음과 같다.
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
int temp = 0;
for(int i = 0; i < score.length; i++) {
priorityQueue.add(score[i]);
if (priorityQueue.size() > k) {
priorityQueue.poll();
}
answer[i] = priorityQueue.peek();
}
return answer;
}
}
이 경우, k 가 score.length 보다 큰 것이 문제가 되었던 내 풀이법과 달리 더 이상 문제될 것이 없다. 따로 fame과 같이 명예의 전당 배열을 사용하지 않고도, 우선순위가 가장 높은 수(가장 작은 수)를 반환하고 제거하지 않는 peek을 사용하기 때문이다.
https://velog.io/@gillog/Java-Priority-Queue%EC%9A%B0%EC%84%A0-%EC%88%9C%EC%9C%84-%ED%81%90