프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 약수의 개수와 덧셈(Java)

Sigfriede 2023. 4. 7. 17:35

  문제 설명

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

 

  제한사항

  • 1 <= left <= right <= 1,000

 

  입출력 예

left right result
13 17 43
24 27 52
class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        for (int i = left; i <= right; i++) {
            int count = 0;
            for (int j = 1; j <= i; j++) {
                if (i % j == 0) {
                    count++;
                }
            }
            if (count % 2 == 0) {
                answer += i;
            } else {
                answer -= i;
            }
        }
        return answer;
    }
}

  이 문제는 left부터 right의 약수를 순서대로 구하는 문제입니다. 입출력 예를 예시로 들면, left는 13, right는 17입니다. 그러니 13, 14, 15, 16, 17의 각 약수의 개수를 구하여 조건에 맞춰 더하거나 빼거나 하는 것입니다. 따라서 for문이 i는 left부터 시작하여 right와 같거나 작을 때까지 순회합니다.

  안쪽 for문은 약수를 구하는 역할입니다. 약수를 구할 때마다 count가 증가합니다. 이렇게 구한 약수의 개수는 if문을 통해 분류해줍니다. 짝수의 경우에는 answer에 i만큼 더하기 할당을, 홀수의 경우에는 i만큼 빼기 할당을 해줍니다. 이러한 계산 뒤에 answer가 반환됩니다.

  다만, 이번 풀이에서는 약수 구하는 방법이 다소 아쉬웠던 것 같습니다. 제곱수를 통해 약수를 구하는 방법이 있더라구요. 만약 약수에 제곱수가 있는 경우에는 약수의 개수가 홀수입니다. 이러한 부분을 생각해서 풀이했다면 조금 더 깔끔한 코드작성이 이루어지지 않았을까 싶습니다.