코딩테스트(JS)/구현&문자열

[javascript] 프로그래머스 / 기사단원의 무기 / lv1

seseyeyo 2023. 10. 29. 21:00

function solution(number, limit, power) {

    let answer = 0
    for (let i = 1; i < (number + 1); i++) {
        let cnt = 0
        for (let j = 1; j <= (i**0.5); j++) {
            if (i === j*j) {
                cnt++
            } else if (i % j ===0) {
                cnt += 2
            }
        }
        cnt > limit ? answer += power : answer += cnt
    }
    
    return answer;
}

이전에 파이썬으로 문제를 해결했었는데, 똑같은 로직을 자바스크립트로 구현하려고 하니 잘 되지 않았다..

그래서 방향을 틀어서 제곱근을 이용한 풀이로 해결해보았다.

 

제곱근을 이용한 풀이는, 예를 들어 16의 약수를 구하면

1,2,4,8,16으로 총 5개가 된다.

이는

1*16

2*8

4*4

의 형태가 된다.

16의 제곱근까지만 약수를 구해주면, 그이상의 값은 굳이 계산해주지 않아도 된다.

만약 제곱근이 무한소수인 수라면,(4나 9, 16... 처럼 제곱근이 유리수가 아니라면) 제곱근 바로 전까지의 수까지만 구해주면 된다.

그래서 만약 j가 제곱근이 아니면서 i % j를 했을 때 딱 나누어 떨어지는 수라면

cnt += 2를 해준다.

그리고 만약 j가 제곱근이라면 cnt++ 하여 1만 증가시켜준다.

그후에 조건에 맞게 limit을 초과한 수라면 power만큼 answer에 증가시켜주고, 그렇지 않다면 cnt만큼 answer에 증가시켜준다.