임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려고 한다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수 구축. 문제 바로가기
일단 한국 용어가 익숙하지 않은 나에게는 문제 자체가 어려웠다 (영문번역기 돌린건 안비밀)...
나의 전략은 아래와 같았다:
- n이 들어오면 제곱인지 파악
- 만약 제곱이면 x + 1하여 제곱 / 만약 제곱이 아니면 -1
- Math.sqrt()를 사용하여 root인지 확인 - if문 사용
- root이면 multiply number by itself
아래와 같이 코드를 작성하였다.
class Solution {
public long solution(long n) {
long answer = 0;
double a = Math.sqrt(n);
if(a == a){
answer = (long) ((a + 1) * (a + 1));
} else {
answer = -1;
}
return answer;
}
}
코드를 작성한 뒤 if문의 조건을 어떻게 작성해야할지 가장 큰 고민이였다. 그리고 조건을 a == a로 작성해보았는데, 오류는 다행히 뜨지 않았다. 가장 먼저 n = 121이였을 때 return 값이 144로 제대로 들어오는 걸 확인 할 수 있었다. 하지만 n = 3이였을 때, -1으로 들어와야하는데, 이상한 값인 7이라는 return 값을 받았다. 즉 제곱이 아닌 숫자가 들어오면 오류가 나는 것이었다.
그리고 사실 if문에 있는 answer도 answer = (a+1)*(a+1)이라고 적었다가 Java에서 자체적으로 오류를 수정하여 (long)을 넣어주었다.
class Solution {
public long solution(long n) {
long answer = 0;
Double a = Math.sqrt(n);
if(a == a.intValue()){
answer = (long) ((a + 1) * (a + 1));
} else {
answer = -1;
}
return answer;
}
}
해당 문제를 풀면서 아래와 같이 배울 수 있었다:
Math.sqrt()는 square root을 찾아주는 메소드를 사용하면 간단하게 찾을 수 있다.
intValue()는 n을 int로 바꿔주는 역할을 한다. 해당 코드에서는 a를 정수형 숫자로 바꿔주고, 바꾸기 전 숫자와 바꾼 후 숫자가 같으면 정수이고, 아닐 경우 n = 3과 같은 제곱이 아닌 숫자가 들어오게 되면 -1을 주게 된다.
Double vs double에서 가장 큰 차이점은 Double은 객체,wrapper타입이고, double은 기본 데이터 유형, primitive타입라는 것이다. 즉, 해당 문제를 풀기 위해서는 a가 a.intValue()와 동일한지 확인을 하기 위해서는 wrapper타입인 Double이 필요함!