완전 제곱수란 무엇인가?
어떤 정수가 다른 정수의 제곱으로 표현될 수 있을 때, 그 수를 완전 제곱수(Perfect Square)라고 합니다. 예를 들어 144는 12 × 12, 484는 22 × 22로 표현할 수 있으므로 완전 제곱수에 해당합니다.
이번 글에서는 숫자 하나를 인수로 받아, 해당 숫자가 완전 제곱수인지 여부에 따라 불리언(Boolean) 값인 true 또는 false를 반환하는 자바스크립트 함수를 작성하는 방법을 알아보겠습니다.
대표적인 완전 제곱수의 예는 다음과 같습니다.
144, 196, 121, 81, 484
반복문을 활용한 구현 방법
1부터 시작하는 정수를 차례대로 곱해 보면서, 입력받은 숫자와 일치하는 제곱값이 나오는지 확인하는 방식으로 문제를 해결할 수 있습니다.
const num = 484;
const isPerfectSquare = num => {
let ind = 1;
while(ind * ind <= num){
if(ind * ind !== num){
ind++;
continue;
};
return true;
};
return false;
};
console.log(isPerfectSquare(num));
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true
코드 동작 원리
이 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
1. 초기화: 변수 ind를 1로 설정하여 가장 작은 양의 정수부터 검사를 시작합니다.
2. 반복 조건: ind × ind가 입력값 num 이하일 때까지 while 루프가 계속 실행됩니다. 만약 ind의 제곱이 이미 num을 초과했다면, 그보다 큰 정수의 제곱 역시 num과 일치할 수 없으므로 반복을 종료하고 false를 반환합니다.
3. 일치 여부 확인: ind × ind가 num과 같으면 해당 숫자는 완전 제곱수이므로 즉시 true를 반환하고, 같지 않으면 ind를 1 증가시킨 후 다음 정수를 검사합니다.
Math.sqrt()를 활용한 더 간결한 방법
자바스크립트의 내장 함수인 Math.sqrt()를 사용하면 위 로직을 한 줄로 더 간결하게 표현할 수도 있습니다. 제곱근을 구한 뒤 그 값이 정수인지 판별하면 됩니다.
const isPerfectSquare = num => {
const sqrt = Math.sqrt(num);
return Number.isInteger(sqrt);
};
console.log(isPerfectSquare(484)); // true
console.log(isPerfectSquare(500)); // falseMath.sqrt()는 제곱근 연산을 내부적으로 처리하므로 코드가 짧고 가독성이 좋다는 장점이 있습니다. 반면 반복문 방식은 부동소수점 오차에 영향을 받지 않는 정수 연산만 사용한다는 점에서 안정적입니다. 상황에 맞게 두 방식 중 적절한 것을 선택해 사용하시기 바랍니다.