2023.04.13

Jay Ji·2023년 4월 12일
0
post-thumbnail

Problem

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려고 한다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수 구축. 문제 바로가기

일단 한국 용어가 익숙하지 않은 나에게는 문제 자체가 어려웠다 (영문번역기 돌린건 안비밀)...

What I tried

나의 전략은 아래와 같았다:

  1. n이 들어오면 제곱인지 파악
  2. 만약 제곱이면 x + 1하여 제곱 / 만약 제곱이 아니면 -1
  3. Math.sqrt()를 사용하여 root인지 확인 - if문 사용
  4. root이면 multiply number by itself

What was Wrong?

아래와 같이 코드를 작성하였다.

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)을 넣어주었다.

What I learned

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;
    }
}

해당 문제를 풀면서 아래와 같이 배울 수 있었다:

1. Math.sqrt();

Math.sqrt()는 square root을 찾아주는 메소드를 사용하면 간단하게 찾을 수 있다.

2. intValue()

intValue()는 n을 int로 바꿔주는 역할을 한다. 해당 코드에서는 a를 정수형 숫자로 바꿔주고, 바꾸기 전 숫자와 바꾼 후 숫자가 같으면 정수이고, 아닐 경우 n = 3과 같은 제곱이 아닌 숫자가 들어오게 되면 -1을 주게 된다.

3. Double vs double

Double vs double에서 가장 큰 차이점은 Double은 객체,wrapper타입이고, double은 기본 데이터 유형, primitive타입라는 것이다. 즉, 해당 문제를 풀기 위해서는 a가 a.intValue()와 동일한지 확인을 하기 위해서는 wrapper타입인 Double이 필요함!

profile
Think out of the Box

0개의 댓글