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

박기영·2022년 11월 27일
1

프로그래머스

목록 보기
99/159

solution 1

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;
}

뭔가...더 깔끔한 풀이가 있을 것 같다.
상황을 세세하게 분류하는건 좋은데, 중복되는 코드가 있어서 보기가 안좋다.
리팩토링을 해보자.

solution 2

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 2sort를 계속해서 진행한다는 점이 문제인 것 같다.
또한, 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이 더 낫다는 결론이 나온다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글