본문 바로가기
내일배움 과제/기타 과제

알고리즘 14번 - 추가공부

by GREEN나무 2024. 11. 13.
728x90

JS

문제

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

제한 사항
n은 0 이상 3000이하인 정수입니다.


계획

1. n을 n보다 작은 i로 나눈 나머지가 0인 값을 찾아 배열로 만든다

2. 배열의 모든 값을 합한다.(reduce)


참고, 풀이

배열의 뒷부분에 요소를 추가할 때는 push() 메소드를 사용합니다.

 

테스트 할 때는 되다가 체점하니 이유도 안알려주고 실패했다길레 쳇gpt를 돌려봤습다.

// 내 오답
function solution(n) {
    let i=0
    let arr=[]
    do{
        i +=1
        if(n%i ===0){
            arr.push(i)
        }
    }while(i<n);
    return arr.reduce((sum,num)=>sum+num,0)
}

 

reduce 함수에서 빈 배열 문제
만약 n = 0 또는 n < 0이 주어지면 약수 배열 arr가 비어 있을 수 있습니다.
reduce 함수는 빈 배열에서 실행하면 오류를 발생시키므로 기본값을 설정해야 합니다.

통과 못한 16번의 값이 0~2였나 봅니다.

// GPT 답
function solution(n) {
    if (n <= 0) return 0; // 음수나 0일 경우 결과 0 반환

    let i = 0;
    let arr = [];
    do {
        i += 1;
        if (n % i === 0) {
            arr.push(i); // i가 n의 약수라면 배열에 추가
        }
    } while (i <= n); // i가 n을 포함하도록 수정
    return arr.reduce((sum, num) => sum + num, 0); // 약수의 합 반환
}

간략화

function solution(n) {
    if (n <= 0) return 0;
    let sum = 0;
    for (let i = 1; i <= n; i++) {
        if (n % i === 0) {
            sum += i; // 약수를 바로 더함
        }
    }
    return sum;
}

function solution(n) {
    if (n <= 0) return 0;
    let sum = 0;
    for (let i = 1; i <= n; i++) {
        if (n % i === 0) {
            sum += i; // 약수를 바로 더함
        }
    }
    return sum;
}

코드 간략화하기

function solution(n) {
    return n === 0 ? 0 : Array.from({ length: n }, (_, i) => i + 1)
                         .filter(v => n % v === 0)
                         .reduce((a, b) => a + b, 0);
}

  배열을 활용하여 처리하기 때문에 직관적이지만, 성능 면에서는 다소 비효율적

더보기
 

이 코드는 주어진 정수 n의 약수들을 모두 더하는 함수입니다. 각 부분을 간단히 설명하겠습니다.

  1. Array.from({ length: n }, (_, i) => i + 1)
    • Array.from을 사용해 길이가 n인 배열을 생성합니다. 배열의 각 값은 1부터 n까지의 숫자입니다.
    • 이 방식은 1부터 n까지의 숫자를 생성하는데 사용됩니다.
  2. .filter(v => n % v === 0)
    • 이 부분은 filter 메서드를 사용하여, n의 약수인 숫자만을 필터링합니다. 즉, n을 해당 숫자로 나누었을 때 나머지가 0인 숫자들만 남깁니다.
  3. .reduce((a, b) => a + b, 0)
    • reduce 메서드는 배열의 값을 누적해서 더하는 역할을 합니다. a는 누적된 합계, b는 현재 값입니다. 초기 값은 0입니다.
  4. n === 0 ? 0 : ...
    • n이 0일 경우 약수의 합은 0이므로, 이를 미리 처리해주는 조건문입니다. 0은 어떤 수로도 나누어지지 않으므로, 바로 0을 반환합니다.

이 방식은 n의 모든 수를 탐색하면서 약수를 구하는 방식입니다. 배열을 활용하여 처리하기 때문에 직관적이지만, 성능 면에서는 다소 비효율적일 수 있습니다.

 

코드 개선

function solution(n) {
    if (n === 0) return 0;
    let sum = 0;
    for (let i = 1; i <= Math.sqrt(n); i++) {
        if (n % i === 0) {
            sum += i + (i !== n / i ? n / i : 0);
        }
    }
    return sum;
}

sqrt(n)은 "square root"의 약자로, 수학에서 n의 제곱근을 의미합니다. 제곱근은 어떤 수를 제곱했을 때 주어진 수가 나오는 값입니다. 예를 들어, sqrt(9)는 3입니다. 왜냐하면 3을 제곱한 값이 9이기 때문입니다.

 

 

 


출처 

배열에 값 추가 : https://hongong.hanbit.co.kr/javascript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B0%B0%EC%97%B4-%EC%83%9D%EC%84%B1-%EC%9A%94%EC%86%8C-%EC%B6%94%EA%B0%80%EC%99%80-%EC%A0%9C%EA%B1%B0/

.

do...while : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/do...while

sqrt() : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt


 

◆ C

더보기

◆ C

계획


참고, 풀이


//



코드 간략화하기

 


출처 

 

 

 

 

 

 

◆ C#

더보기

◆ C#

계획


참고, 풀이


//



코드 간략화하기

 


출처 

 

 

 

◆ C++

더보기

◆ C++

계획


참고, 풀이


//



코드 간략화하기

 


출처 

 

 

 

 

 

 

 

'내일배움 과제 > 기타 과제' 카테고리의 다른 글

sql 6번  (0) 2024.11.18
알고리즘 15번 - 추가공부  (0) 2024.11.18
알고리즘 13번 -추가공부  (1) 2024.11.13
알고리즘 12번 - 추가공부  (0) 2024.11.13
알고리즘 11번-추가공  (2) 2024.11.13