프로그래머스
약수의 개수를 구하는 함수(getDivisor
)를 만들어서 left
부터 right
까지 함수에 대입해가며 sum
값을 구했다.
getDivisor
함수는 1부터 Math.sqrt(num)
까지만 확인했고, num/i===i
인 경우 (ex. 9/3=3)를 제외하고
function solution(left, right) {
//약수의 개수를 구하는 함수를 만든다
//약수가 짝수개이면 더하고, 홀수개이면 뺀다
let sum = 0;
//약수의 개수를 구하는 함수
const getDivisor = (num) => {
const divisors = []; //약수배열
for(let i=0;i<=Math.sqrt(num);i++){
if(num%i===0){
divisors.push(i);
if(num/i===i) continue
divisors.push(num/i);
}
}
return divisors.length;
}
for(let i=left;i<=right;i++){
if(getDivisor(i)%2===0) sum = sum + i;
else{
sum = sum - i;
}
}
return sum;
}
이 풀이법은 약수의 개수를 구하는 함수를 만들지 않고 Number.isInteger((Math.sqrt(i))
를 활용해 문제를 해결했다.
사용된 개념은 어떤 수의 제곱근이 정수이면 약수는 홀수개이고, 제곱근이 아니면 약수는 짝수개라는 것이다.
예를 들어, 16은 Number.isInteger(Math.sqrt(16))===true
이고 약수는 1,2,4,8,16으로 5개이다. 반면 15는 Number.isInteger(Math.sqrt(15))===false
이고 약수는 1,3,5,15로 4개이다.
function solution(left, right) {
let sum = 0;
for(let i=left;i<=right;i++){
if(Number.isInteger(Math.sqrt(i))) sum -= i;
else{
sum = sum + i;
}
}
return sum;
}
앞서 만들었던 함수의 아래 부분과 연관해서 생각해보면 i(정수)가 num의 제곱근인 경우에는 i만 push되어 약수가 홀수개가 되고, i가 num의 제곱근인 경우가 없다면, i와 num/i 2개씩 push되어 약수가 짝수개가 된다.
for(let i=0;i<=Math.sqrt(num);i++){
if(num%i===0){
divisors.push(i);
if(num/i===i) continue
divisors.push(num/i);
}
}
//이 부분에서 num/i===i인 경우는 배열에 i만 push되고,
//그 외의 경우 i와 num/i모두 push된다