Coding test

[프로그래머스] 약수의 합 (Level 1)

Jiwoo 2022. 4. 14. 17:05

문제

정수 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;
}

 

  • 정확도 테스트


     


참고

velog.io/@syveloper