문제 풀기/JavaScripts

문제 33. (중요)약수의 개수와 덧셈(난이도 10)(Number.isInteger)

kagan-draca 2024. 7. 18. 17:30

 

내가 제출한 코드 : 

 

function solution(left, right)
{
    let sum = 0;
    for(let i = left; i <= right; i++)
    {
        let count = 0;
        for(let j = 1; j <= parseInt(Math.sqrt(i));j++)
        {
            i % j == 0 ? i / j != j ? count += 2 : count += 1 : count += 0;
        }
        count % 2 == 0 ? sum += i : sum -= i
    }
    return sum;
}

 

위의 코드로 Math.sqrt()로 제곱근을 구해 반복문의 수행시간을 줄이고, 약수의 개수를 구한 후,

약수의 개수에 따라 더할건지, 뺄건지 결정을 했다.

 

그런데!! 다른 사람의 코드를 보고 

 

        let count = 0;
        for(let j = 1; j <= parseInt(Math.sqrt(i));j++)
        {
            i % j == 0 ? i / j != j ? count += 2 : count += 1 : count += 0;
        }
        count % 2 == 0 ? sum += i : sum -= i

 

부분을 획기적으로 줄일 수 있다는 사실을 알게 됐다.

 

그 방법에는 Number.isInteger()함수를 사용해야 하는데

isInteger(n)에서 n이 정수이면 true, 아니면 false를 반환한다.

 

이를 바탕으로,

function solution(left, right) {
    let result = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) result -= i;
        else result += i;
    }
    return result;
}

 

위와 같이 표현할 수 있었다.

 

Number.isInteger( Math.sqrt() )에 가 true 될 수 있는 수는

4(1, 2, 4), 9(1, 3, 9), 16(1, 2, 4, 8 16) 같이 약수가 홀수인

수 밖에 없다.

 

Number.isInteger( Math.sqrt() )에 가 false인 수는

6(1, 2, 3, 6), 8(1, 2, 4, 8), 10(1, 2, 5, 10)같이 약수가 짝수인

수 밖에 없다.

 

제곱근을 이용하면 좋다는 생각은 해봤지만 이런 식으로 약수의 개수가 홀수인지, 짝수인지

구별할 수 있다는 사실은 몰랐었다. 

 

내가 짠 코드 수행 시간 : 

 

남이 짠 코드 수행 시간 : 

남이 짠 코드 수행시간

 

 

 

 

 

 

 

 

 

수행시간 측면에서 엄청난 차이가 있다는 걸 확인할 수 있다.