스파르타 (React_6기) 본캠프

2024. 09. 25.(알고리즘 - 약수의 개수와 덧셈)

cha123hein 2024. 9. 26. 09:08

★ 문제

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
(1 ≤ left  right ≤ 1,000)

★ 문제 해결 과정

1. left부터 right까지 모든 숫자에 대해 1부터 i까지 나눠 떨어지는 숫자(약수)를 찾는다

(i로 나눴을 때 나머지가 0)

2. 약수의 개수가 짝수면 더하고, 홀수면 빼도록 한다.

 

다른 사람들의 답변 중 가장 신기했던건 "약수는 대칭을 이루는데 제곱근만이 자기 자신과 대칭을 이루기 때문에 제곱근이 정수면 약수의 개수가 홀수다." 라는 사실을 이용해서 푼 답변이다.

확실히 수학적인 지식이 없어도 풀 수가 있기는 하지만 가지고 있다면 어쩔 땐 더 효율적인 방법으로 풀 수 있는 것 같다.

 

★ 제출한 문제 답안

function solution(left, right) {
    let sum = 0;
    
    for(let i = left; i <= right; i++){
        let divisor = [];
        for(let j = 1; j <= i; j++){
            if(i % j === 0) divisor.push(j);
        }
        divisor.length % 2 === 0 ? sum += i : sum -= i;
    }
    
    return sum;
}