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 하여 정답을 출력하는 과정이다.
[JS] 모의고사 - 프로그래머스 (0) | 2024.11.25 |
---|---|
[JS] 2016년 - 프로그래머스 (0) | 2024.11.22 |
[JS] 콜라 문제 - 프로그래머스 (0) | 2024.11.20 |
[JS] 가장 가까운 같은 글자 - 프로그래머스 (0) | 2024.11.18 |
[JS] 숫자 문자열과 영단어 - 프로그래머스 (0) | 2024.11.14 |