프로그래머스

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

Young_Han 2024. 10. 3. 00:01

문제 설명

 

 

[내가 짠 코드]

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        // left에서 right까지 반복
        for( int i = left; i <= right; i++){
            int count = 0;
            // 약수 구하기
            for( int j = 1; j <= i; j++){
                if(i % j == 0){
                    count++;
                } 
            }
                // 약수가 짝수면 answer에 더하고 홀수면 뺀다.
                if(count % 2 == 0){
                    answer += i;
                } else answer -= i;
        }
        return answer;
    }
}

 

  • 이중 for문을 사용해서 문제를 풀었지만 뭔가 깔끔하지 않아서 더 좋은 방법이 없는지 찾아봤다.

 

[효율성을 높이기 위해 리펙토링]

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        // left에서 right까지 반복
        for (int i = left; i <= right; i++) {
            // i의 제곱근을 확인하고 정수이면 약수의 개수가 홀수이다.
            if (Math.sqrt(i) == (int)Math.sqrt(i)) {
                answer -= i;
            } else {
                // 정수가 아니라면 약수의 개수가 짝수이다.
                answer += i;
            }
        }
        return answer;
    }
}
  • Math.sqrt(i) : 루트 값을 구하는 double 값을 반환한다.
  • 제곱근이 정수(int)로 나올 경우에는 약수의 개수가 홀수이다.
    • 예) 9 = √9 = {1, 3, 9} / 16 = √16 = {1, 2, 4, 8, 16}
  • 약수의 개수가 홀수인 경우 asnwer에서 해당 숫자를 빼고 짝수인 경우에는 더한다.

 

결론

코드는 생각할수록 무궁무진하다.