
8 / 1 = 8
8 / 2 = 4
8 / 4 = 2
8 / 8 = 1
해당 문제는 이 수들의 합을 요구한다. 필자는 처음에 문제를 접근할 때, 재귀 함수 또는 For Loop로 1부터 n의 모든 수를 하나 하나 찾는 것으로 접근했다. 코드가 작동은 했으나, 처리 속도 면에선 그닥 효율적이라고 생각되진 않아서, 전지전능한 chatGPT에게 물었더니, 무릎 탁! 치는 답을 알려 주었다.
8 / 1 = 8
8 / 2 = 4
---------
8 / 4 = 2
8 / 8 = 1
따라서, For Loop의 탐색 영역을 n의 제곱근까지만 찾고, n의 약수를 찾게 되면 그 수를 변수에 더하고, 그 약수의 결과값 또한 약수 이기에 더하여 주면 된다. 정말 기똥 찬다.
function solution(n) {
let sum = 0;
const sqrtN = Math.sqrt(n);
for (let i = 1; i <= sqrtN; i++) {
if (n % i === 0) {
sum += i; // i는 n의 약수입니다.
if (i !== n / i) {
sum += n / i; // n / i도 n의 약수입니다.
}
}
}
return sum;
}
// 예시 사용법
console.log(solution(36)); // 출력: 91 (1 + 2 + 3 + 4 + 6 + 9 + 12 + 18 + 36)
console.log(solution(12)); // 출력: 28 (1 + 2 + 3 + 4 + 6 + 12)