임의의 양의 정수 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을 리턴합니다.
public class Solution {
public long solution(long n) {
long answer = 0;
for (long i = 1; i <= n; i ++)
{
if (i * i == n)
{
answer = i+1;
answer = (answer * answer);
break;
}
else
answer = -1;
}
return answer;
}
}
처음에는 Math.Sqrt(n)을 사용하려 했다.
하지만, 제곱근이 Double로 나와 항상 소숫점 까지 계산되어 나타나는데
해당 값이 정수인지 아니면 소숫점이 있는 실수인지 확인하는 방법을 몰라 위처럼 작성했다.
if문에 보면 if(i * i == n)로 작성하기 이전에,
if(n / i == i)로 작성했었다. 이 때 1건에 대하여 오답이 발생했다.
오류가 나는이유는 정확히 모르겠다.
확실하지 않지만, 실수형 제곱근 * 실수형 제곱근 했을 때 정확히 원래값이 나오는게 아닐까?
정답 제출 이후 소수점의 유무를 확인하는 방법을 알았다.
if(n % 1 == 0)
// 실수다
else
// 실수가 아니다.
수를 1로 나누었을 때 나머지가 0이면 정수, 아니면 실수다.