function solution(left, right) {
// 마지막에 활용하기 위한 배열
// left ~ right의 값이 들어가 있다.
let nums = [];
// 약수 개수들이 들어갈 배열
let arr = [];
for(let i = left; i <= right; i++){
let num = i;
nums.push(num);
// num의 약수 개수
// 소인수분해한 거듭 제곱 숫자들의 지수에 +1을 해서 서로를 곱하면 약수의 개수이기 때문
let count = 1;
let countArr = [];
// 소인수 초기 설정
let divider = 2;
// num이 1이면 1을 출력한다.
while(num != 1){
// num이 소인수로 나눠진다면
if(num % divider === 0) {
// num을 소인수로 나눔
num /= divider;
count++;
// 해당 소인수로 다시 반복
} else {
// 소인수가 변경되었으므로 구해놨던 count를 countArr에 넣는다
countArr.push(count);
// 다시 count를 1로 초기화 한다.
count = 1;
// num이 해당 소인수로 나눠지지 않았다면
// 소인수를 1 증가시켜서 반복
divider++;
}
}
// 마지막 count는 countArr에 들어가지 않았기 때문에
// 별도로 처리
countArr.push(count);
let ans = 1;
for(let j = 0; j < countArr.length; j++){
ans *= countArr[j];
}
arr.push(ans);
}
let final = 0;
// 약수의 개수가 짝수라면 그 약수들에 해당하는 숫자를 더하고
// 홀수라면 숫자를 뺀다.
for(let i = 0; i < arr.length; i++){
let value = arr[i];
if(value % 2 === 0){
final += nums[i];
} else {
final -= nums[i];
}
}
return final;
}
굉장히..길다.
소수로 나눠나가면서 같은 소수가 사용된 횟수를 적립하고,
그 것을 배열에 넣어놨다가,
하나의 숫자의 약수의 개수를 구하는데 사용한다.
그렇게 구한 약수의 개수가 홀수인지 짝수인지에 따라
빼거나 더하거나를 구분해서 최종 연산을 진행한다.
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;
}
제곱근이 정수라면 약수의 개수가 홀수이고,
제곱근이 정수가 아니라면 약수의 개수가 짝수인 것을 활용하여 푸셨다.
설명 보기 전까지는 도대체 무슨 원리로 푼건지 이해를 못했다.
굉장히 혁신적인 방법이다.