Level1 - 약수의 개수와 덧셈

문제 설명 및 링크

https://programmers.co.kr/learn/courses/30/lessons/77884?language=javascript

나의 풀이

  • 나눴을때 나머지가 없으면 약수이며, 또한 쌍을 이루는 나머지 숫자도 약수
    • ex: "N === n1 * n2" 일때 n1, n2 모두 약수
  • 2개의 약수를 동시에 찾을 수 있으므로 한번 카운팅할때마다 2씩 증가, 이에 따라 최대 sqrt(N) 번만 for 문 수행
  • 다만 제곱근의 경우에는 n1 === n2 가 동일하므로 이 부분에 대한 예외처리만 추가

다른 사람의 풀이를 보니 타겟 N 의 제곱근이 정수이면 약수의 개수는 홀수, 제곱근이 정수가 아니면 약수의 개수는 짝수 라는 공식으로 훠얼씬 간단하게 코딩을 하더라.

역시 수학이 중요함...

코드

모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.

function solution(left, right) {

    // 약수의 개수를 리턴하는 함수
    const getDivisorLength = n => {
        if (n === 1) {
            return 1;
        }
        
        let count = 0;
        
        // 나눴을때 나머지가 없으면 약수이며, 또한 쌍을 이루는 나머지 숫자도 약수이다. (ex: "N === n1 * n2" 일때 n1, n2 모두 약수임.)
        // 즉 2개의 약수를 동시에 찾을 수 있으므로 한번 카운팅할때마다 2씩 증가하며, 이에 따라 최대 sqrt(n) 번만 for 문을 돌면 됨.
        // 다만 제곱근의 경우에는 n1 === n2 가 동일하므로 이 부분에 대한 예외처리만 추가
        for (let i = 1; i <= Math.sqrt(n); i++) {
            if (n % i === 0) {
                if (i === Math.sqrt(n)) {
                    count += 1;
                } else {
                    count += 2;
                }
            }
        }
        
        return count;
    };
    
    let result = 0;
    
    for (let i = left; i <= right; i++) {
        if (getDivisorLength(i) % 2 === 0) {
            result += i;
        } else {
            result -= i;
        }
    }
    
    return result;
}

좋은 웹페이지 즐겨찾기