k
명예의 전당 목록의 점수의 개수 | 3
score
1일부터 마지막 날까지 출연한 가수들의 점수 | [10, 100, 20, 150, 1, 100, 200]
=> 명예의 전당에 상위 k개의 점수가 올라갈 때, 매일 발표된 명예의 전당의 최하위 점수를 return
우선순위 큐에 점수를 넣어두고 peek()한 결과보다 score 배열의 값이 크다면 poll() 후 add() 연산
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int score_len = score.length;
int[] answer = new int[score_len];
int ans_idx = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
if(score_len < k){
k = score_len;
}
for(int i=0; i<k; i++){
pq.add(score[i]);
answer[ans_idx++] = pq.peek();
}
for(int i=k; i<score_len; i++){
if(pq.peek() < score[i]){
pq.poll();
pq.add(score[i]);
}
answer[ans_idx++] = pq.peek();
}
return answer;
}
}
=> 주의점) k가 score배열의 크기보다 클 수 있으므로 예외처리를 해주어야 함
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int score_len = score.length;
int[] answer = new int[score_len];
int ans_idx = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int sc : score){
pq.add(sc);
if(pq.size() > k){
pq.poll();
}
answer[ans_idx++] = pq.peek();
}
return answer;
}
}
=> 주의점) 예외 처리코드를 굳이 쓰지 않아도 잘 동작하였지만, 오히려 처음보다 느렸음.
pq.size()에서 많은 시간을 썼을거라 생각했음
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
int ans_idx = 0, pq_size = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int sc : score){
pq.add(sc);
pq_size += 1;
if(pq_size > k){
pq.poll();
pq_size -= 1;
}
answer[ans_idx++] = pq.peek();
}
return answer;
}
}
=> 프로그래머스 오류인지, 첫 코드가 가장 빠르게 나와서 분석하기위해 여러번 실행을 돌려보니 제각각의 실행속도가 나왔음..
TIP : 문제를 읽을 때 당연히 n은 m보다 커야한다고 짐작하지 말고, 제한사항으로 따져보는 것이 오류를 줄이는 길이다.