문제 설명 및 입출력 예시
정수 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
'실력 향상 일지 > 프로그래머스' 카테고리의 다른 글
[Java] 자연수 뒤집어 배열로 만들기 (0) | 2022.10.10 |
---|---|
[Java] 정수 제곱근 판별 (0) | 2022.10.09 |
[Java] 평균 구하기 (0) | 2022.10.08 |
[Java] 짝수와 홀수 (0) | 2022.10.06 |
[Java] 자릿수 더하기 (0) | 2022.10.05 |