두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
처음엔 숫자마다 약수를 하나하나 다 구하려고 생각을 했다. 하지만 뭔가 엄청 비효율적인데...?라는 생각이 들었고 다시 생각해보니 약수의 정확한 개수가 필요한게 아니라 약수의 개수가 홀수인지, 짝수인지가 필요하다. 그래서 아래와 같은 방법을 사용했다.
약수의 개수가 홀수일 때는 숫자의 제곱근을 구했을 때 정수가 된다.
- 9의 약수: 1, 3, 9 / Math.sqrt(9) = 3
- 16의 약수: 1, 2, 4, 8, 16 / Math.sqrt(16) = 4
- 25의 약수: 1, 5, 25 / Math.sqrt(25) = 5
- 17의 약수: 1, 17 / Math.sqrt(17) = 4.1231...
- 18의 약수: 1, 2, 3, 6, 9, 18 / Math.sqrt(18) = 4.2426....
- 19의 약수: 1, 19 / Math.sqrt(19) = 4.3588...
Number.isInteger()로 제곱근을 구했을 때 수가 정수인지 확인하고 정수라면 answer에서 빼주고 정수가 아니라면 더해주면 된다:)
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;
}
✔문제출처: 프로그래머스