본문 바로가기

TIL(today i learned)/프로그래머스-코딩테스트

[연습문제][Lv.1] 약수의 합

문제 설명

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

 정수의 약수는 정수이므로, n을 1부터 n까지 돌면서 나눈 값이 정수이면 answer에 더해주는 식으로 짰다.

function solution(n) {
  let answer = 0;
  for (let i = 1; i <= n; i++) {
    if (n % i === 0 ) {
      answer += i;
    }
  }
  return answer;
}

 

=> 그런데, n/i*i = n 이라는 사실을 이용하면 계산 횟수를 줄일 수 있다. 

* 이때, 주의할 점은, 루트 n 값이 정수로 떨어지는 n의 경우, i = n/i 라는 사실.

function solution(n) {
  let answer = 0;
  let sqrt = Math.sqrt(n);
  for (let i = 1; i <= sqrt; i++) {
    if (n % i === 0 && i !== sqrt) {
      console.log(i, n / i);
      answer += i + n / i;
    } else if (i === sqrt) {
      answer += i;
    }
  }
  return answer;
}

 

 

어떤 분은 ternary operator에서 재귀를 사용하는 방식으로 구현을 했는데, 엄청난 듯...!

function solution(n, a=0, b=0) {
    return n<=a/2?b:solution(n,a+1,b+=n%a?0:a);
}