상세 컨텐츠

본문 제목

[JS] 명예의 전당(1) - 프로그래머스

프로그래밍 및 언어/코딩 테스트 문제

by 남민우_ 2024. 11. 21. 10:12

본문

문제

 

예시

k score result
3 [10, 100, 20, 150, 1, 100, 200] [10, 10, 10, 20, 20, 100, 100]
2 [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000] [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]

 

 

풀이

function solution(k, score) {
    let answer = [];
    let honor = [];

    for (let i = 0; i < score.length; i++) {
        if (i < k) honor.push(score[i]);
        else {
            if (score[i] > Math.min(...honor)) {
                honor.splice(honor.indexOf(Math.min(...honor)), 1);
                honor.push(score[i])
            }
        }
        answer.push(Math.min(...honor));
    }

    return answer;
}

 

설명

먼저 정답을 출력한 answer 와 명예의 전당에 등록된 점수들을 기록할 honor 를 별도로 선언해주었다.

 

반복 시행은 매개변수로 들어온 score의 길이만큼 시행한다.

 

이후 먼저 조건문을 통해 명예의 전당이 시작한지 얼마 안됐을 경우를 판별한다.

즉 문제에서 말한 "프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다" 부분을 조건문으로 판별하는 것이다.

 

if( i < k ) 를 통해 반복 시행이 k보다 적을 경우, 즉 명예의 전당의 최대 길이가 k이므로 그보다 반복하지 않았을 경우에는 그대로 honor.push(score[i]) 를 통해 그대로 명예의 전당에 등록한다.

 

주요한 포인트는 이 i < k 가 아닐 경우, 즉 명예의 전당에 자리가 다 차서 기존의 최하위 점수를 쫓아내고 새 점수가 등록되어야 하는 상황이다.

사용한 메서드와 기법을 차례대로 설명하자면,

 

1. splice 메서드

명예의 전당의 최하위 값을 삭제하기 위해 사용하였다. 매개변수로 (삭제하는 값의 인덱스, 시행 횟수) 가 들어가기에 시행 횟수에는 1을, 삭제하는 값의 인덱스에 추가적인 계산을 도입했다.

 

2. indexOf 메서드

간단히 설명해 매개변수로 들어온 값의 인덱스를 반환하는 메서드이다. splice 의 첫번째 매개변수로 들어갈 값을 구하기 위해 사용하였고, 이 안에 최소값을 구하는 공식을 넣었다.

 

3. Math.min(...honor)

사용한 기법은 총 두가지로, 1. 스프레드 기법 과 2. Math 메서드이다.

honor 는 리스트의 형태로 선언되어 있기에 이를 모두 반복시행하여 최소값을 찾기에는 부적합하다고 판단, 스프레드 기법을 통해 하나하나를 모두 전개하였고 이를 Math.min 을 통해 전개된 원소에서 최소값을 탐색하였다.

 

이후 이 else 문이 모두 끝나고 나면, answer 에 다시 honor 의 최소값을 push 하여 정답을 출력하는 과정이다.

관련글 더보기