[프로그래머스/Java] Lv.1 정수 제곱근 판별

febCho·2024년 6월 26일
0

코딩테스트

목록 보기
231/253
post-thumbnail

문제

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

- 제한사항

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

풀이

for(int i=1; i<n; i++){
   if(i*i == n){
        answer = (long) Math.pow(i + 1, 2);
        break;
      }
 }

n이 워낙 큰 수이다 보니, 역시나 위와 같은 기존의 방식대로 풀 수가 없었다. 시간 초과! 그래서 Math 클래스의 다른 메서드를 찾아 보다가 Math.sqrt()를 발견했다.

우선 Math.sqrt(n) 실행 시 기본 타입인 double형으로 n의 제곱근을 반환 받을 수 있다. 문제는 우리가 그 제곱근이 양의 정수인가를 판별해야 한다는 점이다. 이를 위해 나는 Math.floor() 즉, 내림을 사용했다.

내림 시에도 double형으로 숫자가 반환되는 것은 똑같다. 예를 들어 3.52가 3.00이 되는 셈이다. 만약 n의 제곱근이 double 형태이지만 양의 정수였다면, 내림했을 때와 같을 것이라는 거다.

이렇게 제곱근이 양의 정수라는 점을 판별하고 나면, Math.pow()를 통해 제곱근에 +1을 다시 제곱한 수를 구한 다음, 타입에 맞게 (long) 바꾸어 준 다음 answer에 대입하면 된다.

class Solution {
    public long solution(long n) {
        long answer = -1;
        double sqrt = Math.sqrt(n);
        
        if(Math.floor(sqrt) == sqrt) answer = (long) Math.pow(sqrt + 1, 2);
        
        return answer;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글