프로그래머스 Level 1
🔒 약수의 합
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
s | return |
---|---|
12 | 28 |
5 | 6 |
입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=1; i<=n; i++) {
if(n % i == 0) answer += i;
}
return answer;
}
}
뭔가 맘에 들진 않지만 간단하게 해결은 했다.
for문으로 i를 1부터 n만큼 돌리면서 n을 i로 나눴을 때 나머지가 0이라면 약수이므로 answer에 더했다.
처음에 i를 0으로 했다가 java.lang.ArithmeticException 뜬 건 안비밀...ㅎ
정수로 0으로 나누려고 할 때 뜨는 에러이다.
class Solution {
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;
}
}
다른 사람의 풀이에서 발견한 코드를 가져오고 싶었는데 문제가 개편되면서 함수 구성이 달라졌기에 감자의 코드에 다른 부분만 삽입하였다.
다른 부분이 무엇이냐고요?
i를 n/2만큼만 돌리고 return시에 answer+n을 반환하는 것이다.
n / 1 = n 이고 n / 2 = n/2인데 1과 2사이에 더이상 정수가 없다.
그러니 원래의 수에서 나누기 2한 값보다 작은 약수는 원래의 수 말고는 없기 때문에 for문 루프를 반으로 줄이는 방법이다!!
이런 똑똑한 사람들!!
단순히 문제를 푸는 것에 그치지 말고 효율적으로 해결하고 싶다!!
그러려면 수학을 잘해야돼ㅠㅠ
수학 공부를 해야겠다!!