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