Coding test

[프로그래머스] 정수 제곱근 판별 (Level 1)

Jiwoo 2022. 4. 15. 15:44

문제

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

  • 제한 사항

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

나의 풀이

function solution(n) {
    // n = 양의 정수 / x = 임의의 양의 정수
    // if (n = x의 제곱) => (x+1)^2 반환
    // else -1 반환

        //예외처리
        if (n == 1) return 4;

    // for(2부터 n까지, i++)
    for(let i = 2; i < n; i++) {

    // if ( i * i === n) => return (i+1)^2
        if(i*i === n) return (i+1) * (i+1);

    // if ( i * i > n) break;
        else if(i*i > n) break;
    }
    // else -1 반환
    return -1;
}

 
처음 풀었을 때는 n이 1일 때의 예외처리를 하지 않아 테스트 18에서 통과되지 않았다.
예외처리를 해주자 통과는 됐지만, 속도가 느려서 완벽한 해답은 아니다.
 

  • 정확도 테스트 결과


     

다른 풀이

  1. Math.sqrt()를 사용한 코드

    function solution(n) {
     // n = 양의 정수 / x = 임의의 양의 정수
     // if (n = x의 제곱) => (x+1)^2 반환
     // else -1 반환
    
     // if (n의 제곱근 === n의 제곱근.floor) => (n의 제곱근+1)^2
     // else return -1
     let x = Math.sqrt(n);
     return (x === Math.floor(x)) ? (x+1)*(x+1) : -1;
    }

     
    가장 간결한 풀이
    속도도 빠르다
     

    • 정확도 테스트 결과

 

  1. while문으로 1차 선별한 코드

    function solution(n){
    var result = 0;
    var x = 0;
    while (x*x < n){
     x++;
    }
    if (x*x == n){
     x++;
     result = x*x; 
    }else{
     result = -1;
    }
    
    return result;
    }

     
    이건 효율적이진 않지만, 살펴볼만한 코드다.
    while문을 이용해 x*x < n 되는 부분을 걸러냈기 때문이다.