<bash />문제 설명 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요. 제한 사항 n은 0 이상 3000이하인 정수입니다.
내 풀이:
처음에는 나머지가 0인 값을 생성한 배열에 넣고 그 배열을 reduce한 값을 결과로 했었다.
근데 테스트케이스 15번?에서 런타임 오류가 나서 수정😵💫
아마 양의 정수의 제곱근던지였던거같다
<bash />
function solution(n) {
var answer = 0;
for(let i = 1; i < (n + 1); i++) {
if((n % i) === 0) {
answer += i;
}
}
return answer;
}
※예상 에러 케이스 => 제곱근이 약수인 경우
어떤 수 n의 약수 중에 제곱근이 존재한다면, 이 값은 약수 쌍 (√n, √n)에서 두 번 더해질 가능성이 있습니다.
예제: n = 16
약수는 1, 2, 4, 8, 16입니다.
√16 = 4가 약수로 포함됩니다.
이 코드에서는 for 루프에서 i = 4일 때, 약수로 한 번 더해지고, 제곱근으로 또 한 번 더해지기 때문에 4가 중복으로 더해집니다.
다른 풀이:
i를 1부터 √n까지 반복합니다. 약수를 효율적으로 찾기 위해 Math.sqrt(n)까지만 검사합니다.
라고한다.
<bash />
function solution(n) {
var answer = 0;
let i;
for (i = 1; i <= Math.sqrt(n); i++){
if (!(n%i)) {
answer += (i+n/i);
}
}
i--;
return (i === n/i) ? answer-i : answer;
}
<bash />
※위 풀이 해석
i를 1부터 √n까지 반복합니다. 약수를 효율적으로 찾기 위해 Math.sqrt(n)까지만 검사합니다.
이유: 약수는 짝을 이루며 존재합니다. 예를 들어, 12의 약수 (1, 12), (2, 6), (3, 4)처럼 서로 대칭입니다.
따라서, i가 √n 이하인 약수만 검사하면 됩니다.
if (!(n % i)):
n % i가 0인 경우, 즉 i가 n의 약수라면,
약수 쌍 i와 n / i를 합산합니다.
예: n = 12, i = 3일 때, 약수 쌍은 (3, 4)이고, 이를 합산하여 answer에 더합니다.
반복문이 끝나면, i는 √n을 초과한 값이므로, 이를 i--로 조정합니다.
마지막으로, i === n / i인 경우 중복된 약수를 조정합니다.
예: n = 16일 때, i = 4에서 (4, 4)라는 동일한 약수 쌍이 생깁니다.
이런 경우 중복을 방지하기 위해 answer에서 i를 한 번 빼줍니다.
'프로그래머스 > 연습 문제' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습 > 코딩테스트 입문 > 몫 구하기 (0) | 2024.12.31 |
---|---|
[프로그래머스] 코딩테스트 연습 > 코딩테스트 입문 > 나이 출력 (0) | 2024.12.31 |
[프로그래머스] 코딩테스트 연습 > 코딩테스트 입문 > 숫자 비교하기 (0) | 2024.12.31 |
[프로그래머스] 코딩테스트 연습 > 연습문제 > 자릿수 더하기 (0) | 2024.12.16 |