본문 바로가기
알고리즘 스터디/프로그래머스 스킬체크 레벨 1(끝)

[프로그래머스 스킬체크 레벨 1] 약수의 합 풀이 및 설명 - 자바스크립트[JavaScript]

by 레일라오리덕 2021. 7. 14.
728x90

https://programmers.co.kr/learn/courses/30/lessons/12928

 

코딩테스트 연습 - 약수의 합

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요. 제한 사항 n은 0 이상 3000이하인 정수입니다. 입출력 예 n return 12 28 5 6 입출력 예 설명 입출력 예 #1 12의 약수

programmers.co.kr

 

문제

 

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

 

 

제한 사항

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

결괏값 예시

 

n return
12 28
5 6

 

기본 제공 틀

 

function solution(n) {
    var answer = 0;
    return answer;
}

 

풀이 [JavaScript]

 

728x90

우선 들어온 n값의 약수란 1부터 n 본인의 값까지의 수로 n을 나누었을때 나머지가 0이 되는 것이 약수이기 때문에, 1부터 n까지의 값을 돌면서 나머지가 0인 값들을 sum에 합하여 그 값을 리턴하도록 로직을 구현하였습니다.

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

위와 같은 방식은 제한 사항에서의 숫자가 3000이하이기 때문에 커다란 성능 상의 차이가 없게 느껴지지만, 숫자가 커지면 커질수록, for문을 통해 돌아야하는 횟수가 기하급수적으로 늘어나게 된다.

이러한 문제를 해결하기 위해서, 들어온 숫자의 반만 돌 수 있게 코드를 짜보았다.

 

우선 n이 0일 경우는 0을 반환하도록 처리해주고, 중복값 제거를 위해 Set을 이용해보았다.

n의 제곱근을 구해서 그 제곱근보다 작은 수까지 (대략 절반으로 줄어듬) 값을 돌면서 나머지가 0으로 떨어지는 값을 우선 구한다. 12를 예로 들자면, 1, 2, 3이라는 값이 나오게 되는데, 약수는 늘 페어되는 숫자들의 집합이다.

예를 들면, [1, 2, 3]에 특정값을 곱하면 12가 되는데 그 값이 [12, 6, 4]로 이 값들 또한 약수이다.

그래서 결국 약수 [1, 2, 3, 4, 6, 12]를 구하려면 제곱근 아래의 나눠지는 값들에서 12가 되기위해 곱해져야하는 수를 구하면 약수가 구해진다.

하지만 이때, 예를 들어 25가 n값으로 들어오게 되면, 25의 제곱근 즉, 5까지 값을 돌면, [1, 5]가 구해지고 그 값의 페어는 [25, 5]가 되는데, 이 경우에는 5가 중복된다.

이러한 현상을 방지하기 위해 Set함수를 썼고, 그렇게 해서 구해진 set의 값을 [...set]와 같은 스프레드 연산자를 써서 array에 set의 값을 넣어주고, 이 array에서 reduce함수를 써서, a(누산기), v(value)를 이용해서 각각의 value를 a에 누산하여 그 값을 리턴해주었다.

 

function solution(n) {
    if (n === 0) return 0;
    var set = new Set();
    
    for (var i = 1; i <= Math.sqrt(n); i++) {
        if (n % i === 0) {
            set.add(n/i);
            set.add(i);
        }
    }
    return [...set].reduce((a, v) => a + v);
}

채점 결과 [JavaScript]

 

 

728x90

댓글