1. 문제 설명
- 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
2. 제한 조건
3. 입출력 예
let output = solution(12);
console.log(output); // 28
let output = solution(5);
console.log(output); // 6
4. 입출력 예 설명
- 입출력 예 #1: 12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
- 입출력 예 #2: 5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
5. 문제 풀이
function solution(num) {
let sum = 0;
let sqrtNum = Math.ceil(Math.sqrt(num));
for (let i = num; i >= sqrtNum; --i) {
if (num % i === 0) {
sum += i;
sum += num / i;
}
}
if (sqrtNum === Math.sqrt(num)) {
sum -= sqrtNum;
}
return sum;
}
6. 문제 풀이 해설
function solution(num) {
// 분석
// 반목문으로 약수를 체크하면서 동시에 합쳐주면 된다.
// 풀이 1
// 제곱근 값을 구하면 절반까지만 체크하고 몫과 나눠준 수를 약수로 구할 수 있다.
let sum = 0;
let sqrtNum = Math.ceil(Math.sqrt(num));
// 몫과 나눈 값을 모두 넣어준다.
for (let i = num; i >= sqrtNum; --i) {
if (num % i === 0) {
sum += i;
sum += num / i;
}
}
// 제곱근 num이 정수면 이중으로 합산 됐을 것이므로 차감해준다.
if (sqrtNum === Math.sqrt(num)) {
sum -= sqrtNum;
}
return sum;
}
// // 참고: 풀이 2
// // 처음부터 끝가지 다 체크하는 방식이다.
// // 코드는 간단해보이지만 숫자가 커질수록 효율성이 떨어진다.
// let sum = 0;
// for (let i = num; i > 0; --i) {
// if (num % i === 0) sum += i;
// }
// return sum;