function solution(k, score) {
let stack = [];
let ans = [];
for(let i = 0; i < score.length; i++){
const eachScore = score[i];
if(stack.length < k){
stack.push(eachScore);
ans.push(Math.min(...stack));
continue;
}
if(Math.min(...stack) >= eachScore){
ans.push(Math.min(...stack));
continue;
}
stack.sort((a, b) => b - a);
stack.pop();
stack.push(eachScore);
ans.push(Math.min(...stack));
}
return ans;
}
뭔가...더 깔끔한 풀이가 있을 것 같다.
상황을 세세하게 분류하는건 좋은데, 중복되는 코드가 있어서 보기가 안좋다.
리팩토링을 해보자.
function solution(k, score) {
let stack = [];
let ans = [];
for(let i = 0; i < score.length; i++){
stack.push(score[i]);
stack.sort((a, b) => b - a);
if(stack.length >= k){
ans.push(stack[k - 1]);
continue;
}
ans.push(stack[stack.length - 1]);
}
return ans;
}
오, 훨씬 깔끔해졌다. 그런데...걸리는 시간은 solution 1
이 훨씬 짧다.
아무래도 solution 2
는 sort
를 계속해서 진행한다는 점이 문제인 것 같다.
또한, stack
길이가 k
를 넘어가도 상관없이 계속 증가해버린다는 점도 시간을 늘리는 것 같다.
function solution(k, score) {
let stack = [];
let ans = [];
for(let i = 0; i < score.length; i++){
stack.push(score[i]);
if(stack.length >= k){
stack.sort((a, b) => b - a);
ans.push(stack[k - 1]);
continue;
}
ans.push(Math.min(...stack));
}
return ans;
}
sort
를 필요한 부분에서만 진행되도록 해보았다.
그러나 크게 성능이 달라지지는 않았다.
그렇다면 가장 큰 원인은 stack
의 길이가 제한없이 길어진다는 것이 되겠다.
성능적으로는 stack
의 길이까지 관리했던 solution 1
이 더 낫다는 결론이 나온다.