문제 설명
정수 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);
}
'TIL(today i learned) > 프로그래머스-코딩테스트' 카테고리의 다른 글
[연습문제] [Lv.1] 자연수 뒤집어 배열로 만들기 (0) | 2022.11.11 |
---|---|
[연습문제] [Lv.1] 자릿수 더하기 (0) | 2022.11.11 |
[연습문제] [Lv.1] 평균 구하기 (0) | 2022.11.11 |
[연습문제] [Lv.1] 짝수와 홀수 (0) | 2022.11.11 |
[Lv.1] 신고결과 받기 (0) | 2022.09.02 |