[プログラマー]約数の個数と加算


質問する


https://programmers.co.kr/learn/courses/30/lessons/77884

に答える


2つの数の間の数字(2つの数を含む)の約数の個数を求めて、条件によって加算と減算を行います.

コード#コード#

public int solution(int left, int right) {
        int answer = 0;

        for (int i = left; i <= right; i++) {
            int divisor = divisor(i);
            if (divisor % 2 == 0) {
                answer += i;
            } else {
                answer -= i;
            }
        }

        return answer;
    }

	// 약수 구하는 함수
    private int divisor(int N) {

		/**
         * N의 약수 중 하나가 m이라고 했을 때 다른 약수는 N/m이다.
         * 따라서 루트 N까지 구하면 약수 절반의 개수를 알 수 있다.
         * 절반의 개수를 구하고 거기에 2를 곱해주자.
         * 루트 N이 i와 같으면 제곱근 이므로 1개로 카운트 하자.
         * 제곱근: 제곱해서 나온 값이 N과 같은 경우
         */
        int count = 0;
        for (int i = 1; i * i <= N; i++) {
            if (i * i == N) count++;
            else if (N % i == 0) count += 2;
        }

        return count;
    }