하루살이 개발일지

[Algorithm] 약수의 개수 구하기 - 제곱수의 약수의 개수는 홀수임을 활용 본문

알고리즘

[Algorithm] 약수의 개수 구하기 - 제곱수의 약수의 개수는 홀수임을 활용

harusari 2023. 6. 20. 10:07

 

제곱수의 특성과 제곱수의 약수의 개수

  • 제곱수의 약수의 개수가 홀수인 것은 제곱수의 특성 때문
  • 제곱수는 항상 어떤 수를 제곱한 형태
    • 그 약수는 쌍을 이루는 약수들이 있고, 그 가운데 제곱한 수 자신만이 쌍을 이루지 않는 약수로 홀수개의 약수를 가지게 됨
    • 예를 들어 16 (4 X 4) 이라는 제곱수일때, 16의 약수는 1, 2, 4, 8, 16인데, 이 약수들 중에서 1과 16은 쌍을 이루고 2와 8은 쌍을 이룸.
    • 그러나 4는 쌍을 이루지 않는 유일한 약수
    • 따라서 16의 약수는 총 5개로 홀수

제곱근 활용했을 때와 아닐 때의 코드 효율성

 

 

제곱근 활용하지 않았을 때 (for 반복문 사용)

const findDivisors = (num) => {
  const divisors = [];
  for (let i = 1; i <= num; i++) {
    if (num % i === 0) {
      divisors.push(i);
    }
  }
  return divisors;
};

const isDivisorCountOdd = (num) => {
  const divisors = findDivisors(num);
  return divisors.length % 2 !== 0;
};

console.log(isDivisorCountOdd(16));  // true
console.log(isDivisorCountOdd(15));  // false
  • findDivisior 함수 : 주어진 숫자의 모든 약수를 찾아 배열로 반환하는 함수
  • isDivisorCountOdd : findDivisor 함수를 호출해 약수의 배열을 얻은 다음, 배열의 길이가 홀수인지 여부를 반환하는 함수
  • 이는 16(제곱수) 일때 약수의 개수가 홀수이고, 15(안 제곱수)는 약수의 개수가 짝수임을 보여줌
  • 하지만, 이런 방식은 숫자가 커질수록 많은 계산을 필요로 함.

제곱근 활용했을 때 (Math.sqrt() 사용)

const isSquareNumber = (num) => {
  return Number.isInteger(Math.sqrt(num));
};

console.log(isSquareNumber(16));  // true
console.log(isSquareNumber(15));  // false
  • isSquareNumber 함수는 주어진 숫자의 제곱근이 정수인지 확인해 제곱수인지 판별하는 함수
  • 즉, isSquareNumber(16)은 true를 반환하고, 15일때는 false를 반환함
  • 이는 위의 isDivisorCountOdd 함수와 동일한 결과를 반환하지만 계산 효율성 면에서 훨씬 우수함