JavaScript/알고리즘

프로그래머스 약수의 합 JS

hihiha2 2023. 7. 25. 19:12

문제 설명

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

 

 

🙋‍♀️ 내 생각

지난번에 풀었던 약수를 구하는 문제에서, 거의 유사하다.

구한 약수들을 모두 합쳐서 그 합을 결괏값으로 리턴하면 된다.

 

아래는 지난번에 풀었던 약수구하기 문제이다.

 

프로그래머스 약수구하기 JS

문제 설명 정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요. 🙋‍♀️ 내 생각 n이라는 숫자를 매개변수로 받아서 약수를 구하고

hihiha2.tistory.com

 

✅ 내 코드

function solution(n) {
 let arr =[]
    for(i=1; i<=n; i++){
       if(n%i===0) {
           arr.push(i)
       }
   }
    return arr.reduce((acc,cur)=> acc+cur,0)
}

약수들을 마지막에 합을 구하기 위해서 reduce()를 써야겠다고 생각했다.

그래서 우선 맨 처음에 arr라는 빈배열을 만들고 초기화했다.

 

그런 다음, for문을 사용하여 i부터 n까지의 범위를 설정했다.

여기서는 i라고 적었지만, 실제의 의미는 n을 나누어줄 숫자를 의미한다. 

그래서 n을 1부터 시작해서 n과 동일한 값만큼 나눌 것이기때문에 저렇게 범위를 지정하였다.

i는 1씩 커지면서 n의 값을 테스트한다.

 

if문을 통해서 n을i로 나눈 값이 0인지를 검사한다. 만약 나머지 값이 0이라면, n의 약수라는 것을 의미하므로 

arr에 push한다.

 

그리고 나서 결과를 확인하면, arr는 약수들만을 모은 배열이다.

 

마지막으로 arr를 reduce를 통해서 처음부터 끝까지 값을 더한다.

 

 

 

💻  다른사람 코드중에 배울 것 

function solution(num) {
    let sum = 0;
    for (let i = 1; i <= num; i++) {
        if (num % i === 0) sum += i
    }
    return sum
}

기본적인 방식은 동일하지만 굳이 arr를 생성하지 않고 코드를 짰다.

 

우선, sum이라는 변수에 0으로 초기화를 한다.

그리고 i부터 n까지 범위를 지정하여 for문을 도는데, n%i의 값이 0일때 특정한 작업을 하는 것은 동일하다.

하지만 배열이 아니므로 push가 아니고, sum에 += i를 통해 약수의 값을 바로 더한다.

 

마지막으로 sum을 리턴한다.

 

굳이 배열을 생성하지 않고, 또 reduce과정을 한번 더 거치지 않는 점이 장점이다.

합계를 구한다고 해서 꼭 reduce를 사용해야겠다는 생각을 버리면 좋을 것 같다.

 

 

🙋‍♀️ 내 생각

이전에 약수구하기 문제도 풀어봤고 문제자체도 복잡하지는 않아서 금방 풀 수 있었다.

그래도 저렇게 reduce를 한번 더 사용하면 아무래도 반복을 한번 더 하기때문에 효율성이 떨어질 수도 있겠다는 생각이 들었다.

 

다음에는 sum에 바로 더하는 방식을 잊지 말아야겠다..!!