코딩테스트

[JS] 연습문제 > 야근 지수

차차한 2022. 9. 22. 14:33

function solution(n, works) {
    
    var sum = works.reduce((acc,val)=>acc+val)
    
    if(sum <= n){
        return 0;
    }

    while(n > 0){
        
        var max = 0;
        
        for(var i = 0; i < works.length; i++){
            
            if(works[i] > max){
                var inum = i;
                max = works[i]
            }
        }
        works[inum] -= 1;
        n--;
    }    
    return works.reduce((acc,val)=>acc + val**2,0);
}

works에 있는 값 중에 가장 큰 값에서 1씩 빼주면 된다. 뺄 때마다 n에서도 1을 빼줘 n이 0이 될 때까지 반복하면 된다.

단 works의 누적값이 n보다 적다면 바로 0을 리턴해준다.

 레벨3치고는 크게 어렵지 않았던 문제인데 효율성에서 시간이 오래 걸렸다.

알고보니 max를 구하는 곳에서 처음에는 Math.max로 구했는데 이 방법이 시간이 오래 걸린다고 하더라.

그래서 다르게 로직 구현해서 통과-!

 

+다른 사람 풀이

const noOvertime = (no, works) => {
    while ( no > 0 ) {
        works.sort((a,b) => b-a);
        works[0] -= 1;
        no--;
    }
    return works.map(a => a*a).reduce((a,b) => a+b);
}

works를 계속 내림차순으로 정렬해 가장 큰 수에서 1씩 빼는 식으로 로직을 구현했다.