Algorithm

[알고리즘] 약수의 개수와 덧셈

montmer27 2026. 1. 29. 09:02

문제 요구사항

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


제한사항

  • 1 ≤ left  right ≤ 1,000

풀이

import java.util.stream.IntStream;
class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        //약수의 개수를 구하는 함수 countAll
        answer = IntStream.rangeClosed(left,right) //left부터 right까지
            // .filter(n -> countAll(n) % 2 == 0) //약수의 개수가 짝수인 것만
            .map(n -> countAll(n) % 2 == 0? n : -n)//짝수인 것은 그냥 두고, 홀수인 것만 음수로 변환한다.
            .sum(); //더한다
        return answer;
    }
    
    int countAll(int number){
        int count = 0;
        for(int i = 1;i<=number;i++){
            if(number % i == 0) count++;
        }
        return count;
    }
}

모범답안

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

        for (int i=left;i<=right;i++) {
            //제곱수인 경우 약수의 개수가 홀수
            if (i % Math.sqrt(i) == 0) {
                answer -= i;
            }
            //제곱수가 아닌 경우 약수의 개수가 짝수
            else {
                answer += i;
            }
        }

        return answer;
    }
}

실패 요인

 

인사이트

문제는 완벽하게 이해했더라도 예시까지 자세히 보도록 하자.
홀수인 수를 뺀다는 것은 제외한다는 의미일 수도 있지만, 마이너스(-)의 의미도 있을 수 있다.
Solution 클래스 내에서 활용할 함수를 생성하는 법을 배웠다. 접근 제어자는 default로 설정되므로 굳이 적지 않아도 무방하다.
스트림을 사용하기 위해선 java.util.stream.Intstream을 import 해야 한다.

 

문제 출처

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr