본문 바로가기
알고리즘 문제

[프로그래머스]정수 제곱근 판별-JavaScript

by rinny01 2025. 1. 2.
반응형

문제

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

 

제한사항

  • n은 1이상, 50000000000000 이하인 양의 정수입니다.

입출력예

n return
121 144
3 -1
  • 121 은 양의정수 11의 제곱이므로, (11+1)을 제곱한 144 리턴
  • 3은 양의정수의 제곱이 아니므로 -1 리턴

풀이

function solution(n) {
    var answer = 0;
    if(0 < n && n < 50000000000000 ){
        for(let i=1; i<=n; i++){
            if(i*i == n){
                return (i+1)*(i+1);
            }
        }
        return -1;
    }
}
console.log(solution(121))
  • 물론 이거도 맞지만 for문의 조건대로 let i=1; i<=n; i++ 이렇게 돌리면 굉장히 비효율적이다.
  • 121이라면, 11*11 까지만 찾으면 되는데 121까지 반복하기때문에 i*i <=n 까지만 확인하면 된다.
function solution(n) {
    var answer = 0;
    if(0 < n && n < 50000000000000 ){
        for(let i=1; i*i<=n; i++){
            if(i*i == n){
                return (i+1)*(i+1);
            }
        }
        return -1;
    }
}
console.log(solution(121))

 

풀이2

 Math.sqrt(); 함수를 사용해보자.

 

  • 문법
Math.sqrt(x);

 

  • x 는 숫자
  • 반환값 : 주어진 숫자에 루트를 씌운다. > 만약 숫자가 음수이면 NaN을 반환한다.
  • 예시
Math.sqrt(9); // 3
Math.sqrt(2); // 1.414213562373095

Math.sqrt(1); // 1
Math.sqrt(0); // 0
Math.sqrt(-1); // NaN

 

수정된 코드

function solution(n) {
    let sqrt = parseInt(Math.sqrt(n));
    if(0 < n && n < 50000000000000 ){
        if(sqrt*sqrt == n){
            return (sqrt+1)*(sqrt+1)
        }else{
            return -1
        }
    }
}
console.log(solution(121))
  • let sqrt = parseInt(Math.sqrt(n)); 
    • Math.sqrt()로 제곱근을 구하고 parseInt로 정수로 만들어준다
반응형
LIST