[Java] 약수의 개수와 덧셈 Lv1

Date:     Last Updated:

약수의 개수와 덧셈

문제 프로그래머스 FAQ 내용을 보니 카카오나 기업의 문제들은 저작권이 있으니 풀이를
github나 개인블로그에 올리지 말라고 되어 있어서 링크로 대체합니다.

출처: Programmers
약수의 개수와 덧셈

문제의 이해

주어진 범위의 수에서 약수가 짝수인 수는 더하고 홀수인 수는 빼서 나온 값을 출력하면 된다. 이번에도 Lv1답게 어렵지 않은 문제였다.

내가 생각한 풀이 방법

주어진 left(시작 수), right(끝 수)

  1. 반복문으로 left부터 right까지 반복. 반복되는 수는 i
  2. i를 1부터 i/2까지 반복해서 나머지가 0이면 약수의 갯수 +1
  3. 여기서 약수의 갯수는 1개를 가지고 시작한다. 약수란 i/2를 넘는 수가 나올 수는 없기 때문이다. 이때 자기자신은 포함해야하기 때문에 1부터 시작
  4. 약수의 갯수를 모두 구한 후 그 갯수가 (약수 % 2 == 0) 가 true면 더하고 false면 뺀다.

풀이

첫 번째 풀이

첫번째 풀이대로 풀었다. 인텔리전스의 도움 없이 풀어보려고 풀다가 이것저것 오류가 많이 나서 결국 vscode에서 풀었다… 여튼 풀이 방법 그대로 풀었다. 하지만 코드가 맘에 들지 않는 건 여전하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        int checkNumber = 1;
        for(int i = left; i <= right; i++){
            for(int j = 1; j <= i/2; j++){
                if(i % j == 0){
                    checkNumber++;
                }
            }
            if(checkNumber % 2 == 0){
                answer += i;
            }
            else{
                answer -= i;
            }
            checkNumber = 1;
        }
        return answer;
    }
}

두 번째 풀이

동일한 내용이지만 삼항연산자로 코드의 양을 줄였다. 다만 이게 가독성이 좋은 지는 모르겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        int checkNumber = 1;
        for(int i = left; i <= right; i++){
            for(int j = 1; j <= i/2; j++){
                 checkNumber = (i % j == 0) ? checkNumber + 1 : checkNumber;
            }
            answer += (checkNumber % 2 == 0) ? i : (i * -1);
            checkNumber = 1;
        }
        return answer;
    }
}

다른 사람의 풀이

문제를 풀고 다른 사람의 풀이를 봤는데 제일 추천을 많이 받은 풀이다. 난 몰랐는데 어떤 수 i의 제곱근이 자연수로 존재하는 수는 약수가 홀수이다.(이런 수를 제곱수라고 한다.) 이유는 제곱수가 갖는 성질 여기에 자세히 나와있다. 간단하게 설명하면 어떤 수의 약수를 알고 싶으면 i x j 이런식으로 직접 구해보면된다. 12와 16를 비교하면 12는 1x12, 2x6, 3x4 1,2,3,4,6,12 이렇게 6개이다. 16은 1x16, 2x8, 4*4 1,2,4,8,16 이렇게 총 5개인데 이유는 4가 2번 나오기 때문에 홀수가 되는 것이다. 그래서 더 간단하게 구하는 방식인 것 같아서 참고로 넣었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
    }
}


Leave a comment