문제 설명
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제한 사항
- n은 0 이상 3000이하인 정수입니다.
입출력 예
CODE
class Solution {
public int solution(int n) {
int answer = 0;
int temp = 0;
for(int i = 1; i < n; i++) {
if(n % i == 0) {
temp = n / i;
if(temp < i) break;
answer += i + temp;
}
}
return answer;
}
}
위의 코드가 처음 작성한 코드이다. 어렴풋이 책에서 봤던 알고리즘 코드가 떠올라 코드 자체를 외웠다기보다는 로직을 이해했어서 기억을 상기시키면서 코드를 작성했다. for문을 돌리며 n으로 나누어 떨어지는 i 값이 있으면 temp에 n / i 값을 담았다. 그리고 answer에 저장하기 전에 temp에 담긴 값이 i 보다 작으면 중복 저장이라 생각해 for문을 종료했다. 예를 들면, n이 12고 i가 3이라고 치자. 그럼 temp에는 12 / 3 = 4가 담길 것이고 조건을 통과해 answer에 담길 것이다. 그다음 i가 4일 때 temp에는 12 / 4 = 3이 담긴다. 3은 이미 이전에 더한 값이고, 이후에 나올 i들은 모두 전에 더한 값이기 때문에 종료시켰다.
이 상태로 뿌듯해하며 코드를 제출했더니 테스트 케이스 3개가 실패했다.
뭐가 문제일까 하다가 테스트 케이스에 추가로 1을 넣어봤더니 결괏값이 0이 나와버리는 사태가 발생했다.
코드를 분석해보니 for 조건식에 부등호가 '<'로 되어있어서 for문 자체가 돌지 않는 게 1차적인 문제였다. 그래서 부등호를 '<='로 수정해서 실행해봤더니 이제 결괏값이 2가 나왔다. temp에 1이 저장되어있고, i가 1.. 여기서 두 개를 더한 값을 answer에 저장하고 return 해서 2라는 값이 나온 거 같아 조건문을 하나 더 추가했다.
class Solution {
public int solution(int n) {
int answer = 0;
int temp = 0;
for(int i = 1; i <= n; i++) {
if(n % i == 0) {
temp = n / i;
if(temp < i) break;
if(temp == i) answer += i;
else answer += i + temp;
}
}
return answer;
}
}
뭔가 if문이 덕지덕지 붙어있는 거 같지만 그래도 노력해서 푼 것 같아 뿌듯하다.
실행 결과