문제: 두 정수
left
와right
가 매개변수로 주어질때,left
에서right
까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성하시오.
입출력 예
left | right | result |
---|---|---|
13 | 17 | 43 |
24 | 27 | 52 |
문제 해석
숫자 하나하나의 약수들을 전부 찾아보면서 그 숫자를 세기는 너무 비효율적이라고 생각했다.
그래서 일정한 패턴을 찾아보기로 했다.
대부분의 정수의 약수의 개수는 짝수이다. 하지만, 약수의 개수가 홀수인 경우가 있다.
바로, 그 정수의 제곱근이 정수일 때이다.
그러므로 보통의 경우에는 더하고, 제곱근이 정수인 수는 빼주면 된다.
나의 풀이
function solution(left, right) {
let result = 0;
// 두 정수 사이의 수들을 더하고 빼줄 result라는 변수를 생성한다.
for (let i = left; i <= right; i++) {
// left부터 right까지 모든 수를 살펴본다.
if (Math.sqrt(i) === parseInt(Math.sqrt(i))) {
// 사이의 수 중에서 제곱근이 정수일때는 약수의 개수가 홀수이다.
result -= i;
// 약수의 개수가 홀수이면 result에서 그 수만큼 빼준다.
} else {
result += i;
// 그렇지 않은 경우는 약수의 개수가 짝수이므로 result에게 더해준다.
}
}
return result;
// 결과를 리턴한다.
}
알게된 것
풀이에서 작성한 Math.sqrt(i) === parseInt(Math.sqrt(i))
보다 정수인지 확인하는 더 좋은 함수를 알게 되었다.
Number.isInteger(value)
value가 정수인지 확인할 수 있고, 반환값으로 Boolean값을 준다.
이를 사용해서 식을 바꿔보면 아래와 같이 바꿀 수 있다.
function solution(left, right) {
let result = 0;
for (let i = left; i <= right; i++) {
if (Number.isInteger(Math.sqrt(i))) {
// 이 부분만 변경하였다.
result -= i;
} else {
result += i;
}
}
return result;
}