[프로그래머스 | Javascript] 기사단원의 무기

박기영·2022년 11월 27일
0

프로그래머스

목록 보기
98/159
post-custom-banner

시간 초과

function getDivisor(number){
    const divisor = [];
    
    for(let i = 1; i <= number; i++){
        if(number % i === 0){
            divisor.push(i);
        }
    }
    
    return divisor.length;
}

function purchaseWeapon(states, limit, power){
    let steel = 0;
    
    states.forEach((state) => {
        if(state > limit){
            steel += power;
        }
        
        if(state <= limit){
            steel += state;
        }
    })
    
    return steel;
}

function solution(number, limit, power) {
    const knights = new Array(number).fill(0);
    
    const attackStates = knights.map((_, index) => {
        const state = getDivisor(index + 1);
        
        return state;
    });
                                
    const totalSteel = purchaseWeapon(attackStates, limit, power);
    
    return totalSteel;
}

시간 초과로 인해 오답 처리되었다.

  1. map 내부에서 for가 동작하기 때문에 시간 소모가 크다.
  2. getDivisor에서 number까지 전부 연산을 하기 때문에 시간 소모가 크다.

기능을 쪼개는 것에 집중한 나머지
함수 하나하나에서 시간 소모가 심한 반복문이 작성된 것도 한몫하는 것 같다.

solution 1

function getDivisor(number){
    const divisor = [];
    
    for(let i = 1; i <= (number / 2); i++){
        if(number % i === 0){
            divisor.push(i);
        }
    }
    
    return divisor.length + 1;
}

function purchaseWeapon(states, limit, power){
    let steel = 0;
    
    states.forEach((state) => {
        if(state > limit){
            steel += power;
        }
        
        if(state <= limit){
            steel += state;
        }
    })
    
    return steel;
}

function solution(number, limit, power) {
    const knights = new Array(number).fill(0);
    
    const attackStates = knights.map((_, index) => {
        const state = getDivisor(index + 1);
        
        return state;
    });
                                
    const totalSteel = purchaseWeapon(attackStates, limit, power);
    
    return totalSteel;
}

우선 약수를 구하는 부분을 개선해보았다.
주어진 숫자의 절반까지만 구한 뒤에 +1을 하면 약수의 개수를 얻을 수 있다는 점을 활용했다.

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

0개의 댓글