[js] 약수의 개수와 덧셈_Number Of Divisors And Addition
[문제 설명]
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- 1 ≤ left ≤ right ≤ 1,000
[입출력 예]
left right result13 | 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