명예의 전당 - 프로그래머스

자라나는 ㅇㅅㅇ개발자·2023년 11월 23일
0

TIL

목록 보기
114/126

이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일 동안 진행된 가수의 점수가 [10, 100, 20, 150, 1, 100, 200]이라면, 명예의 전당에서 발표된 점수는 아래의 그림과 같이 [10, 10, 10, 20, 20, 100, 100]입니다.

우선 생각한건 반복문을 활용해 명예의전당 배열에 숫자를 하나씩 넣을 때마다 오름차순 정렬하고 0번째 인덱스의 숫자를 answer 배열에 넣는 그림을 그려보았다.

public int[] solution(int k, int[] score) {
    int[] answer = new int[score.length];
    int[] fame = new int[k];
    Arrays.fill(fame, 2000);
    // 1 ~ k일차
    for (int i = 0; i < k; i++) {
        fame[i] = score[i];
        Arrays.sort(fame);
        answer[i] = fame[0];
    }
    // k+1 ~ score.length일차
    for (int i = k; i < score.length; i++) {
        if (fame[0] < score[i]) {
            fame[0] = score[i];
            Arrays.sort(fame);
        }
        answer[i] = fame[0];
    }
    return answer;
}

오름차순 정렬 후 0번째 인덱스의 수(가장 낮은 수)를 answer 배열에 추가해야하기 때문에 k일차 기준으로 따로 설계하였고
정수배열의 초기값은 0이기 때문에 answer에 0이 들어가는 것을 막기 위해서 점수의 최대값인 2000을 넣고 시작했다.
k일차 부터는 score의 값이 명예의 전당 0번째 인덱스의 수 보다 높을 경우에만 덮어쓰고 다시 오름차순 정렬을 하도록 했다.

코드를 실행했을 때 예제는 정답으로 나왔지만 제출을 했더니
테스트 9와 11에서만 런타임 에러로 실패가 발생했다.

이렇게 26개의 테스트 중에 두개에서 문제가 발생한거면 대부분 어이없는 이유가 많았는데...

검색해보니 나와같은 케이스의 사람들이 많이 있었나보다.

https://school.programmers.co.kr/questions/41276

명예의 전당이 9개인데 참가자가 7명인 케이스였다;;
결국 k의 값이 score.length보다 커서 ArrayIndexOutOfBoundsException가 발생해서 실행이 안되고있었다.

개선 코드

public int[] solution(int k, int[] score) {
    int n = Math.min(k, score.length);
    int[] answer = new int[score.length];
    int[] fame = new int[n];
    Arrays.fill(fame, 2000);

    // 1 ~ n일차
    for (int i = 0; i < n; i++) {
        fame[i] = score[i];
        Arrays.sort(fame);
        answer[i] = fame[0];
    }

    // n + 1 ~ score.length일차
    for (int i = n; i < score.length; i++) {
        if (fame[0] < score[i]) {
            fame[0] = score[i];
            Arrays.sort(fame);
        }
        answer[i] = fame[0];
    }
    return answer;
}

0개의 댓글