[프로그래머스 | Javascript] 월간 코드 챌린지 시즌2 - 약수의 개수와 덧셈

박기영·2022년 9월 14일
0

프로그래머스

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

solution

function solution(left, right) {
    // 마지막에 활용하기 위한 배열
    // left ~ right의 값이 들어가 있다.
    let nums = [];
    
    // 약수 개수들이 들어갈 배열
    let arr = [];
    
    for(let i = left; i <= right; i++){
        let num = i;
        
        nums.push(num);
        
        // num의 약수 개수
        // 소인수분해한 거듭 제곱 숫자들의 지수에 +1을 해서 서로를 곱하면 약수의 개수이기 때문
        let count = 1;
        
        let countArr = [];
        
        // 소인수 초기 설정
        let divider = 2;

        // num이 1이면 1을 출력한다.
        while(num != 1){
            // num이 소인수로 나눠진다면
            if(num % divider === 0) {    
                // num을 소인수로 나눔
                num /= divider;
                
                count++;
    
                // 해당 소인수로 다시 반복
 
            } else {
                // 소인수가 변경되었으므로 구해놨던 count를 countArr에 넣는다
                countArr.push(count);
                
                // 다시 count를 1로 초기화 한다.
                count = 1;
                
                // num이 해당 소인수로 나눠지지 않았다면
                // 소인수를 1 증가시켜서 반복
                divider++;
            }
        }
        
        // 마지막 count는 countArr에 들어가지 않았기 때문에
        // 별도로 처리
        countArr.push(count);
        
        let ans = 1;
        
        for(let j = 0; j < countArr.length; j++){
            ans *= countArr[j];
        }
        
        arr.push(ans);
    }
    
    let final = 0;
    
    // 약수의 개수가 짝수라면 그 약수들에 해당하는 숫자를 더하고
    // 홀수라면 숫자를 뺀다.
    for(let i = 0; i < arr.length; i++){
        let value = arr[i];
        
        if(value % 2 === 0){
            final += nums[i];
        } else {
            final -= nums[i];
        }
    }
    
    return final;
}

굉장히..길다.
소수로 나눠나가면서 같은 소수가 사용된 횟수를 적립하고,
그 것을 배열에 넣어놨다가,
하나의 숫자의 약수의 개수를 구하는데 사용한다.

그렇게 구한 약수의 개수가 홀수인지 짝수인지에 따라
빼거나 더하거나를 구분해서 최종 연산을 진행한다.

다른 분 풀이

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

제곱근이 정수라면 약수의 개수가 홀수이고,
제곱근이 정수가 아니라면 약수의 개수가 짝수인 것을 활용하여 푸셨다.

설명 보기 전까지는 도대체 무슨 원리로 푼건지 이해를 못했다.
굉장히 혁신적인 방법이다.

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

0개의 댓글