ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.12.10 // Programmers_약수의 개수와 덧셈
    AIL( Algorithm I Learned) 2023. 12. 10. 18:06

    ## AIL_ 약수의 개수와 덧셈

    *** 문제 설명
    두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

    *** 제한사항
    1 ≤ left ≤ right ≤ 1,000

    *** 입출력 예
    left right result
    13 17 43
    24 27 52

    *** 입출력 예 설명
    ** 입출력 예 #1_다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
    약수 약수의 갯수
    13 1, 13 2
    14 1, 2, 7, 14 4
    15 1, 3, 5, 15 4
    16  1, 2, 4, 8, 16 5
    17  1, 17 2
    따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

    ** 입출력 예 #2_다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
    약수 약수의 개수
    24 1, 2, 3, 4, 6, 8, 12, 24 8
    25 1, 5, 25 3
    26 1, 2, 13, 26 4
    27 1, 3, 9, 27 4
    따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 각 숫자의 약수 개수를 구하고, 그 개수에 따라 덧셈 또는 뺄셈을 수행하는 방식으로 해결할 수 있습니다. 


    2. 문제풀이

    function solution(left, right) {
        var answer = 0;
    
        for (let num = left; num <= right; num++) {
            let divisorCount = 0;
    
            // 각 숫자의 약수 개수를 구하는 부분
            for (let i = 1; i <= num; i++) {
                if (num % i === 0) {
                    divisorCount++;
                }
            }
    
            // 약수 개수가 짝수인 경우 덧셈, 홀수인 경우 뺄셈을 수행
            answer += (divisorCount % 2 === 0) ? +num : -num;
        }
    
        return answer;
    }
    
    /*
    테스트 1
    입력값 〉	13, 17
    기댓값 〉	43
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	24, 27
    기댓값 〉	52
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `solution` 함수 선언을 통해 `left`와 `right` 두개의 매개 변수를 받고, 함수 내부에서는 결과를 누적할 변수인 `answer`를 0으로 초기화 합니다.

    function solution(left, right) {
        var answer = 0;

     

    2. `for` 외부 반복문을 통해 `left`부터 `right`까지의 각 숫자 (`num`)를 반복합니다. 각 숫자에 대해 현재 `num`에 대한 약수의 개수를 세는데 사용할 변수 `divisorCount`가 0으로 초기화됩니다. 

        for (let num = left; num <= right; num++) {
            let divisorCount = 0;

     

    3. `for` 내부 반복문을 통해 약수의 개수를 셉니다. 1부터 현재 숫자 `num`까지 반복하고, 각 반복에서 `num`이 `i`로 나누어 떨어지면 (`num % i === 0 `), `divisorCount` 가 증가합니다. 내부 반복문은 현재 `num`에 대한 약수의 개수를 세는 역할을 합니다. 

            for (let i = 1; i <= num; i++) {
                if (num % i === 0) {
                    divisorCount++;
                }
            }

     

    4. 삼항연산자 조건부 덧셈/뺄셈을 통해, 현재 `num`에 대한 약수 개수를 센 후, 해당 약수의 개수가 짝수인지 홀수인지 확인합니다. 만약 짝수라면 현재 `num`을 `answer`에 더하고, 홀수라면 `anwser`에서 현재 `num`을 뺍니다. 

            answer += (divisorCount % 2 === 0) ? +num : -num;
        }

     

    5. 마지막으로 누적된 `answer`를 반환합니다.

        return answer;
    }

    3. 다른사람의 문제풀이 및 접근방식 분석

    function solution(left, right) {
         var answer = 0;
         for (let i = left; i <= right; i++) {
             if (Number.isInteger(Math.sqrt(i))) {
                 answer -= i;
             } else {
                 answer += i;
             }
         }
         return answer;
     }
     /*
    테스트 1
    입력값 〉	13, 17
    기댓값 〉	43
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	24, 27
    기댓값 〉	52
    실행 결과 〉	테스트를 통과하였습니다.
     */

     

    1. `anser` 변수를 0으로 초기화합니다. 이 변수는 최종 결과에 누적됩니다. 

    function solution(left, right) {
        var answer = 0;

     

    2. `for` 반복문을 통해 숫자를 순회합니다. `left`부터 `right`까지의 범위까지 반복문을 돌며 각 숫자 `i`에 대해 아래와 같이 작업을 수행합니다.

        for (let i = left; i <= right; i++) {

     

    3. `if (Number.isInteger(Math.sqrt(i)))` 부분은 현재 숫자 `i`의 제곱근이 정수인지 확인하는 조건문입니다. 여기서 `Math.sqrt(i)`는 숫자 `i`의 제곱근을 계산하고, `Number.isInteger()`는 주어진 값이 정수인지 여부를 판별하는 함수입니다. => 이 조건문은 주어진 숫자 `i`의 제곱근이 정수인 경우와 아닌 경우를 구분하여 덧셈과 뺄셈을 수행합니다. 

            if (Number.isInteger(Math.sqrt(i))) {
                answer -= i;
            } else {
                answer += i;
            }
        }

     

    4.  마지막으로 누적된 `answer`를 반환합니다

        return answer;
    }

    #  Number.isInteger() 메서드란?

    주어진 값이 정수인지 여부를 확인하는 메서드로, 정수이면 `true`를 반환하고, 아니라면 `false`를 반환합니다.


    #  Number.isInteger() 사용방법

    Number.isInteger(value);

    #  Number.isInteger() 장단점

    ** 장점

    명시적으로 정수 여부를 확인할 수 있어 정확한 판별이 가능합니다. `isInteger`는 정수 여부만을 확인하므로 소수점 이하 등에 영향을 받지 않습니다. 

    ** 단점

    `Number.isInteger(NaN)` 과 같이 정의되지 않은 값에 대해서도 `false`를 반환하므로 주의가 필요합니다.


    #  Number.isInteger() 사용시기

    ** 활용시기

    주어진 값이 정수인지 여부를 명확하게 확인해야 할 때 사용됩니다. 부동소수점 수에 영향받지 않고 정확한 정수 여부를 판단할 수 있습니다.

    ** 사례

    숫자가 정수인 경우에만 특정 로직을 수행해야 할 때, 반복문에서 정수를 다룰 때 정확한 조건을 검사할 때.

    ** 주의사항

    Number.isInteger(NaN)와 같이 정의되지 않은 값에 대해서도 false를 반환하므로 주의가 필요합니다. 부동소수점 연산의 정확도에 의해 영향을 받지 않는다면 활용이 용이합니다.

     


    #  Math.sqrt() 메서드란?

    주어진 숫자의 제곱근을 반환하는 함수로, 양의 실수가 아닌 음수를 인자로 받으면 `NaN`을 반환합니다.

     


    #  Math.sqrt() 사용방법

    Math.sqrt(value);

    #  Math.sqrt() 장단점

    ** 장점

    숫자의 제곱근을 쉽게 구할 수 있습니다. 

    ** 단점

    음수를 인자로 주면 `NaN`을 반환하므로 주의가 필요하며 부동소수점 연산에서 발생하는 반올림 등의 오차에 영향을 받을 수 있습니다.


    #  Math.sqrt() 사용시기

    ** 활용시기

    주어진 숫자의 제곱근을 구해야 할 때 사용됩니다.특히, 약수 개수가 홀수인지 짝수인지를 판단하는데 활용됩니다.

    ** 사례

    약수의 개수, 소인수분해 등 수학적 계산에 사용될 때, 특정 숫자에 대한 제곱근을 비교하여 판단해야 할 때.

    ** 주의사항

    음수에 대한 처리를 고려해야 합니다. 음수에 대한 Math.sqrt()는 NaN을 반환합니다. 부동소수점 연산의 정확도에 영향을 받을 수 있으므로 주의가 필요합니다.

     

Designed by Tistory.