풀고 나서 그렇게 깔끔한 코드는 아닌 것 같아서 다른 풀이를 찾아보았다.
function solution(k, scores) {
let answer = []; // 매일 최소 점수 배열 (길이 = score 길이)
let honors = []; // 명예의 전당
let minHonor = 0; // 명예의 전당 중 최소 점수 (= answer에 들어갈 값)
for (let i = 0; i < scores.length; i++) {
if (i < k) {
honors.push(scores[i]);
minHonor = Math.min(...honors);
} else {
if (scores[i] > minHonor) {
honors.push(scores[i]);
honors.sort((a, b) => b - a);
honors.pop();
minHonor = Math.min(...honors);
}
}
answer.push(minHonor);
}
return answer;
}
else문을 뺄 수 있었다. i < k에서는 honor에 추가하면서 기본 honor 배열을 만드는 로직이 추가될 뿐, 들어온 점수와 최소값을 비교하고 점수를 honors에 추가하고 내림차순 정렬하는 것은 모든 경우에 다 해당이 됐다.
minHonor 변수도 불필요했다. 점수가 최하위 점수보다 큰지를 판별할 때만 Math.min이 쓰이고 여러 군데서 쓰이지 않았기 때문이다.
최소값을 가져오는 것은 sort 정렬을 거친 후 배열의 맨 마지막 값을 가져오는 메서드(at(-1))로 기존 값에서 연산이 가능했다.
function solution(k, scores) {
let answer = []; // 각 차수의 최소 점수
let honors = []; // 명예의 전당
for (let i = 0; i < scores.length; i++) {
if (i < k) {
honors.push(scores[i]);
}
if (scores[i] > Math.min(...honors)) {
honors.pop();
honors.push(scores[i]);
honors.sort((a, b) => b - a);
}
answer.push(honors.at(-1));
}
return answer;
}
유익한 글이었습니다.