https://programmers.co.kr/learn/courses/30/lessons/12928
문제
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제한 사항
- n은 0 이상 3000이하인 정수입니다.
결괏값 예시
n | return |
12 | 28 |
5 | 6 |
기본 제공 틀
function solution(n) {
var answer = 0;
return answer;
}
풀이 [JavaScript]
우선 들어온 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]
'알고리즘 스터디 > 프로그래머스 스킬체크 레벨 1(끝)' 카테고리의 다른 글
[프로그래머스 스킬체크 레벨 1] K번째 수 풀이 및 설명 - 자바스크립트[JavaScript] (0) | 2021.07.15 |
---|---|
[프로그래머스 스킬체크 레벨 1] 이상한 문자 만들기 풀이 및 설명 - 자바스크립트[JavaScript] (0) | 2021.07.14 |
[프로그래머스 스킬체크 레벨 1] 문자열 내림차순으로 배치하기 풀이 및 설명 - 자바스크립트[JavaScript] (0) | 2021.07.14 |
[프로그래머스 스킬체크 레벨 1] 문자열을 정수로 바꾸기 풀이 및 설명 - 자바스크립트[JavaScript] (0) | 2021.07.14 |
[프로그래머스 스킬체크 레벨 1] 문자열 내 p와 y의 개수 풀이 및 설명 - 자바스크립트[JavaScript] (0) | 2021.07.14 |
댓글