프로그래머스/명예의 전당(1)

dev.홍성원·2023년 7월 8일

코딩테스트

목록 보기
2/4

명예의 전당(1)
https://school.programmers.co.kr/learn/courses/30/lessons/138477


문제는 다음과 같다.
매일 한명의 가수가 나와서 노래를 부르고, 명예의전당은 k 순위까지 표시를 한다.
k일차까지는 전원 명예의 전당에 등재되어있다가, k일이 지난 후 부터는 매일 한명씩 탈락이 될 것이다.
이때 매일 명예의 전당에 올라간 점수중 가장 낮은 점수가 발표 점수다.

이 문제를 해결하기 위해
1. 우선 k 크기의 배열을 만들어서 명예의 전당을 의미하는 뜻을 사용한다.
2. 새로운 점수가 들어오면 랭크와 비교 후 반영하고, 발표점수를 저장한다.
이렇게 해결하려고 했다.

그래서 코드의 흐름은
1. for문으로 다음의 내용을 score의 크기만큼 반복(score의 크기는 일수를 의미하니까)
2. rank에 score을 반영 후 sorting
2-1. k일 이전에는 rank의 i의 index만큼 sorting 후 i를 result에 저장.
2-2. k일 이후에는 rank의 k-1과 새로운 score을 비교 후 더 큰값을 rank에 남기고 작은수는 제외
2-2-1. 이때 새로운 score가 최소값이면 종료. 아니면 다시 sorting

이렇게 계획하고 풀려는데... 뭔가 좀 복잡하다.

그래서 다시 고민을 해봤다.

그러다 List의 sort기능을 생각했고,
List로 score을 순차적으로 저장하며 정렬해서,
k일 이전에는 일차의 인덱스를 꺼내고,
k일 이후에는 계속 k번째 인덱스만 꺼내서 result에 추가하면 더욱 간단해 질 것 같았다.

public static int[] solution(int k, int[] score) {
        
        int[] answer = new int[score.length];
        List<Integer> rank = new ArrayList<>();

        for(int i = 0; i < score.length; i++) {
            rank.add(score[i]);
            rank.sort(Comparator.reverseOrder());
            
            if(i < k) {
                answer[i] = rank.get(i);
            } else {
                answer[i] = rank.get(k - 1);
            }
        }

        return answer;
    }

생각했던대로 잘 실행돼서 기뻐하던 차에 다른사람들의 풀이를 보는데 많은 사람들이 PriorityQueue를 사용해서 풀었다.

그래서 PriorityQueue를 공부할 목적으로 이 포스팅을 작성한다.

profile
백엔드 신입 개발자

0개의 댓글