명예의 전당 (1)
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/138477
접근 방식
점수를 리스트에 넣고 내림차순 정렬을 한다.
반복문을 돌리면서, i가 k-1보다 작은경우에는 i번째 인덱스를 answer에 저장하고
큰 경우에는, list에서 k-1번째 인덱스를 answer에 저장한다.
결과
소스 코드
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
List<Integer> list = new ArrayList<>();
int tmp = -1;
for(int i=0; i<score.length; i++){
list.add(score[i]);
Collections.sort(list, Collections.reverseOrder());
if(i<k-1){
answer[i] = list.get(i);
} else{
answer[i] = list.get(k-1);
}
}
return answer;
}
}
다른 접근 방식
우선순위큐를 이용한 문제 풀이가 있었다.
나도 사실 맨 처음에는 우선순위큐를 이용한 문제풀이를 생각했었지만 어떻게 이용해야 할지 감이 안 잡혀서, 이용하지 못했다.
내림차순이라는 것에 너무 집작하다보니, 큐는 FIFO이기에 맨 뒤 객체에 접근할 수 없어서 풀 수 없다고 판단했다.
하지만, 오름차순으로 접근해서 큐 사이즈를 3개로 관리했다면 풀 수 있었을 것이다.
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
PriorityQueue<Integer> q = new PriorityQueue<>();
int tmp = -1;
for(int i=0; i<score.length; i++){
q.offer(score[i]);
if(i<k){
answer[i] = q.peek();
} else{
q.poll();
answer[i] = q.peek();
}
}
return answer;
}
}
알게 된 점
문제를 바라보는 시각을 좀 더 넓혀서, 역으로 풀 수 있는 방법에 대해서 생각해보는 계기가 되었다.