Jayksss DEV
article thumbnail
<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를 한 번 빼줍니다.

 

profile

Jayksss DEV

@Jayksss

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!