juniordev 2022. 10. 7. 21:45

문제 설명 및 입출력 예시

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

n return
12 28
5 6

제한사항 - n은 0 이상 3000이하인 정수

입출력 예 설명 -

12의 약수 = 1,2,3,4,6,12 따라서 다 더하면 28

5의 약수 = 1,5 따라서 다 더하면 6


코드 & 풀이과정

public static int Solution(int n){
        int answer = 0;
        for (int i = 1; i <= n; i++) {
            if(n % i == 0){
                answer += i;
                //System.out.println("answer = " + answer);
            }
        }
        return answer;
    }

 

12의 약수는 1, 2, 3, 4, 6, 12이다. 그리고 12를 넣었을 때 return 돼야 되는 값은 1 + 2 + 3 + 4 + 6 + 12인 28이다. 그리고

약수에 해당하는 값을 알기 위해서는 12와 12이하의 수 n을 나눴을 때 나머지가 0이라면 미지수 n이 약수에 해당한다는 뜻이 된다.

그리고 원하는 리턴값은 n값을 모두 더한 값이므로 answer을 따로 설정하여 answer에 n값이 나올 때마다 더해주면 된다고 생각했고 코드를 짜 봤다.


 

회고

하지만... 여전히 다른사람들의 풀이는 나의 이해를 아득히 뛰어넘었다.

public int solution(int n) {
        int answer = 0;
            for(int i = 1; i <= n/2; i++){
        if(n%i == 0) answer += i;
      }
        return answer + n;
    }

사실 풀면서도 12 기준으로 {7,8,9,10,11}까지 버려지는 숫자가 무려 5개나 되니까 메모리의 낭비가 심하다는 생각은 했지만 나의 깊지 않은 견해로는 어쩔 수 없다고 생각하고 넘겼다. 하지만 이분은 그냥 아예 반으로 나눠버리고 어차피 처음 지정받는 n은 n으로 나눴을 때 무조건 나머지가 0이므로(약수 이므로) 절반으로 나눠 버린 다음 약수를 구한 후 return값에 n값을 추가하기만 하면 되므로 메모리 낭비를 최대한 줄인 아주 스마트한 방법이지 않을 수 없었다.

 

 


💻프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12928