js/[문제풀이] programmers

[js] 약수의 개수와 덧셈_Number Of Divisors And Addition

우금붕 2023. 2. 13. 22:37

[문제 설명]

두 정수 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 해야 합니다.

 

 

 

[문제 풀이]

function solution(left, right) {
    let result = 0;
    for (var i=left; i<=right; i++){
        divisors(i) % 2 == 0 ? result += i : result -= i;
    }
    return result;
}

function divisors(num) {
    let count = 0;
    for(let j=0; j < num + 1; j++) {if(num % j === 0) count++;}
    return count;
}

 

 

 

[해설]

저는 약수를 구하는 함수 divisors를 따로 만들었습니다.

divisors는 숫자를 0부터 순서대로 나누어 약수를 구하고, 약수가 있을 때마다 count를 올려 총 약수의 개수를 구하는 함수입니다.

(지금 보니 1부터 시작해도 됐겠네요)

 

solution 함수는 left와 right를 받아 시작과 끝으로 사용합니다.

divisors 함수의 값, 즉 약수의 개수가 짝수라면 result에 더하고 홀수면 빼줬습니다.

 

 

 

 

 

[다른 사람 풀이]

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;
}

 

 

처음 보고 머리가 띵했습니다..

"제곱근이 정수면 약수의 개수가 홀수다"

라는 것을 사용한 코드입니다.

 

예를 들어 숫자 9는 제곱근이 3으로 정수가 나오고, 숫자 2는 제곱근이 1.414213562373095 로 실수가 나옵니다.

 

이 코드는 Math.sqrt로 제곱근을 구하고 Number.isInteger로 정수 여부를 확인하여 짝/홀수를 구분하여 결과값을 도출해내도록 구현됐습니다.

 

 

 

 

* Math.sqrt()

숫자의 제곱근을 반환합니다.

Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095

 

 

* Number.isInteger()

전달된 값이 정수인지 여부를 결정합니다.

Number.isInteger(0); // true
Number.isInteger(1); // true
Number.isInteger(0.1); // false

 

 

[느낀점]

수학 개념을 알고 이를 코드에 적용시킬 수  있는 능력 또한 정말 중요한 것 같습니다 ㅠㅠ

약수의 개수를 구하는데 제곱근 개념이 사용될 수 있다는 것은 또 참 새로운 충격이었습니다.

알고리즘 공부를 하면서 자주 나오는 수학 개념은 꼭 잊지 않고 기억할 수 있도록 노력해야겠습니다.

 

 

 

 

[github] - NumberOfDivisorsAndAddition.js

https://github.com/yh725k/javascript.git

 

GitHub - yh725k/javascript

Contribute to yh725k/javascript development by creating an account on GitHub.

github.com