
다음 표는 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 해야 합니다.
수포자다.
부끄러운 말이지만 약수가 뭔지부터 검색해봤다.
약수, 約數
어떤 수나 식을 나누어 나머지가 없이 떨어지는 수나 식을 일컫는 말.
"3은 6의 ∼이다. ↔배수"
상기 기재해놓은 예시를 보면 13의 약수(나눴을때 나머지가 없는 수)는 1과 13이다. 홀수를 깔끔하게 나누려면 자기자신과, 1을 나누면 된다.
function (left, right) 에 주어진 매개변수중 left 부터 right까지의 수의 약수를 구하여 약수가 짝수이면 더하고 약수의 갯수가 홀수인 수는 빼라는 식이다.
1. 약수를 구하는 알고리즘을 보자, 홀수는 자기자신과 1을 나누어 정수인 수가 약수. 즉 약수는 짝수개가된다.
2. 즉 어떤 숫자의 제곱근이 딱 떨어진다면, ex 4 = 1, 2, 4 자기자신을 포함한 약수의 갯수는 홀수개가 된다.
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;
}
if( Number.isInteger(Math.sqrt(i)) 를 보면, 배열이 돌아가는 i라는 수의 제곱근이 isInteger(정수) 일경우 즉 if(i의 제곱근이 정수이라면) 약수는 홀수개 이니 빼고 그렇지 않으면 더해라.
인터넷에서 검색해보았던 약수 구하는 알고리즘이라고 한다. 수포자로써 알고리즘이 어려워지기 시작했다.