코딩 테스트/test_javaScript

[코딩테스트/javaScript] 기사단원의 무기

ijooha 2025. 1. 18. 10:25

일단 문제 자체가 이해하는데 시간이 오래 걸렸다...ㅎ

공책 펴두고 적어가면서 정리했는데,

 

1 for문 사용하여 기사들 수 반복

2 각 기사의 약수의 개수(즉 각 공격력)을 담은 배열 초기값 설정 (arr = [];)

3 약수의 개수를 찾는 반복문, 개수를 (2번)배열에 push 해주기
4 (2번의)약수의 개수 담은 배열에 .map 사용하여 초과값 power로 변경

5 .reduce 사용하여 모든 값 더해주기

 

이렇게 정리했고, 순서대로 코드를 짜봤다.

function solution(number, limit, power) {
    let factor = [];
    
    for (let i=1; i<=number; i++) {
        let count = 0;
        
        for (let j=1; j<=i; j++) {
            if (i % j === 0) {
                count++;    
            }
        }
        factor.push(count);
    }
    
    let limitP = (p) => {
        if (p > limit) {
            return power;
        } return p;
    };
    
    let reduce = (cur, add) => {
        return cur + add;
    }
    
    return factor.map(limitP).reduce(reduce);
}

** 일단 틀린 건 아닌 거 같은데, 시간초과로 실패했다.

어떤 걸 의미없이 반복하면서 시간을 잡아먹는 건지 알아봐야겠음

 

뭔가 약수를 구하는 반복문이 비효율적일 것 같다. 그 외에는 다 줄일 수 없는 것임(아마)

 

1. 제곱근만큼만 반복문 진행 (count + 2)

> 약수는 항상 짝이 있기 때문 (8의 경우 {1,8}, {2,4})

2. 제곱근이 같은 경우 빼주기 (count -1)

> 25의 경우 {5,5}가 중복됨

 

위 조건을 추가해서 계산을 줄여봐야겠다

 

function solution(number, limit, power) {
    let factor = [];
    
    for (let i=1; i<=number; i++) {
        let count = 0;
        let sqrt = Math.sqrt(i);
        
        for (let j=1; j<=sqrt; j++) {
            if (i % j === 0) {
                count+=2;    
            }
            if (j === i/j) {
                count --;
            }
        }
        factor.push(count);
    }
    
    let limitP = (p) => {
        if (p > limit) {
            return power;
        } return p;
    };
    
    let reduce = (cur, add) => {
        return cur + add;
    }
    
    return factor.map(limitP).reduce(reduce);
}

통과 -!