정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
function solution(n) {
let answer = 0;
for(let i = 0; i <= n; ++i){
if(n % i === 0){
answer += i;
}
}
return answer;
}
약수란 나누어떨어지는 값, 즉 나누었을 때 나머지가 0인 것들을 찾아내면 되는 단순한 문제였다. 고민할 시간조차 필요가 없었다!! 바로 제출했지 뭐야~
근데 너무 비효율적인 것 같아서 조금이나마 성능을 올리는 방법이 뭐가 있을까 하다가 아래와 같은 방법으로 바꿨다. 물론! 3000 이하의 숫자에서는 크게 차이가 없을 것이다.
function solution(n) {
let answer = 0;
let half = n / 2;
for(let i = 0; i <= half; ++i){
if(n % i === 0){
answer += i;
}
}
answer += n;
return answer;
}
약수로 나누어떨어지는 수는 값의 절반 이후에는 자신의 값만 존재하므로 반에 해당하는 값만 반복문을 돌리고 입력된 자신의 값을 더해준다.
입력된 값을 487742, 1111111로 가정하고 테스트했는데 역시나 결과가 나오는 시간이 많이 단축된다.
function solution(n, a=0, b=0) {
return n<=a/2?b:solution(n,a+1,b+=n%a?0:a);
}
역시나 이번에도 굳이.. 재귀 함수로 푼 케이스가 좋아요를 가장 많이 받았다.
이제 삼항 연산자를 이용해서 푸는 저런 방식의 규칙이 보이기 시작한다.
return 반복 조건식 ? 결괏값 : 함수명(입력값, 반복 조건 값의 변화, 결괏값의 변화)
재귀 함수는 반복할 조건이 맞을 때까지 함수를 다시 실행시킨다.
참고 자료 및 사이트 (감사합니다)