[JavaScript] 약수의 합

프로그래머스 new Set(), for, reduce()

문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한 사항

n은 0 이상 3000이하인 정수입니다.

입출력 예

n return
1228
56

입출력 예 설명

- 입출력 예 #1

12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.

- 입출력 예 #2

5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.

약수라니! 몇년만에 들어보는 단어인가 😱 초중고시절 학원다니던 기억들이 새록새록 ㅋㅋ 약수는 어떻게 구하더라... 라고 고민하다가 검색까지 ㅋㅋㅋ 하.. 심각하다 ㅋㅋ 약수를 설명하자면, 예를들어 12의 약수란 어떤 정수를 곱해서 12가 되는 수를 12의 약수라고 한다. 머리를 돌려보았다. 어떻게 하면 내가 코드를 이용해서 약수를 뽑아낼까? 내 머리속을 생각한 로직은 일단 어떤 수와 어떤수를 곱했을 때, n이 되는걸 만드려면 n이하의 수를 for을 두번 돌려서 n이 되는걸 배열에 넣고 set()을 이용해 중복을 없엔 후 reduce()를 이용해 배열안에 숫자를 다 더해주는 것이다. 하지만 뭔가 굉장히 비효율적인 느낌이였다. 그래도 일단 give it a go!!

나의 풀이

function solution(n) {
    const divisor = [];
     for(let i=0; i<n+1; i++){
        for(let j=0; j<n+1; j++){
            i*j === n && divisor.push(i,j)
            }
        }
    const set = new Set(divisor);
    const uniqueDivisor = [...set];
    return uniqueDivisor.reduce((prev,curr)=> prev+curr)
}

문제가 풀렸다!!! 신기해 ㅋㅋㅋ 하지만 이 비효율적인것 같은 찝찝함.. 🤔 다른사람들의 풀이를 보고 큰 깨달음이 왔다. 처음에 modulo를 사용한거 보고 뭐지? 했는데 그래.. 약수인 수로 나누면 0이지.. ㅋㅋㅋ 이걸 이용할 수 있었는데 저렇게 무식하게 풀다니 ㅠㅠ 다시 한번 더 도전해본다.

나의 풀이 2

function solution(n) {
    divisor = 0;
for(let i = 0; i<n+1; i++){
    n%i ? 0 : divisor+=(i*1)
}
    return divisor
}

훨씬 코드가 간결해졌고 찝찝함이 살짝 사라졌다! 나머지가 0인 수를 만날 때 마다 divisor에 더해주는 형식으로 풀었다. 문제가 풀리니까 너무 재미있다 ! ㅋㅋㅋ