문제
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
- 제한 사항
n
은 0 이상 3000이하인 정수입니다.
나의 풀이
function solution(n) {
let arr = [];
// n % i == 0 인 값으로 배열 생성
// 1. for문 -> n % i == o ? arr.push : continue;
for(let i = 0; i <= n; i++) {
if (n % i === 0) arr.push(i);
else continue;
}
// 배열값 모두 더하기
// 1. reduce로 더하기
return arr.reduce((sum, el) => sum + el, 0)
}
점점 풀이에 익숙해지고 주석 작성에 방법이 생기기 시작했다.
추상적인 방법, 그 밑에 생각나는 구현 방법을 적는 것이다.
만약 1번에서 구현에 실패하거나 더 좋은 방법이 생각나면 2, 3 이렇게 늘려나가면 될 것 같다.
- 정확도 테스트 결과
간추린 풀이
function solution(num) {
let sum = 0;
for (let i = 1; i <= num; i++) {
if (num % i === 0) sum += i
}
return sum
}
훨씬 간결하고 좋은 풀이
🔑 모범 풀이
약수를 찾기 위해서 전체 다 순회할 필요가 없다.n/2
까지 순회하면 된다.
예를 들어 12의 약수는 [1,2,3,4,6,12] 이다.
12/2인 6과 12 사이에는 약수가 나올 수 없다.
홀수도 마찬가지이다. ex) 21의 약수 [1,3,7,21]
결론적으로 약수를 구하려면 1부터 n/2까지 순회한 다음, 본인을 더해주면 된다.
function solution(n) {
let sum = 0;
for(let i = 1; i <= n/2; i++) {
if(!(n%i)) sum += i
}
return sum + n;
}
정확도 테스트
참고
'Coding test' 카테고리의 다른 글
[프로그래머스] 자릿수 더하기 (Level 1) (0) | 2022.04.14 |
---|---|
[프로그래머스] 이상한 문자 만들기 (Level 1) (0) | 2022.04.14 |
[프로그래머스] 시저 암호 (Level 1) (0) | 2022.04.14 |
[프로그래머스] 소수 찾기 (Level1) (0) | 2022.04.11 |
[프로그래머스] 문자열 다루기 기본 (Level 1) (0) | 2022.04.06 |