Algorithm

[프로그래머스] 연습문제 (정수 제곱근 판별)

펭귄코기 2022. 9. 26. 01:21

문제 설명

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

 

제한 조건

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

 

입출력 예시

n return
121 144
3 -1

 

나만의 해설

처음에 스스로 풀어내지 못했다 그래서 다른 팀원의 설명을 듣고 이해한 내용을 설명하겠다

일단 임시로 a라는 변수를 0 으로 초기화 시켜놓고

while문을 도는데 입력받는 n 까지 돌게 한다

그 밑에서 a++해서 a값을 계속 증가시켜주는데 그 이유는

if문에서 a*a 했을때 n과 같은지를 찾아내고

같다면 a를 +1해서 제곱해서 answer에 담아주는 식으로 해주고

아니라면 -1을 넣어주도록 해줬다

메서드를 사용하지 않고 제곱이되는 수인지 아닌지를 수동적으로 확인하기 좋은 코드인거 같다

 

하지만 이렇게 했을때 시간초과가 나온다 그래서 인터넷에 메서드를 사용한 방법을 써봤다

처음에 x라는 변수에 Math.sqrt() 를 이용해서 double로 만들어주고

그 값이 x.intValue()랑 같냐고 했을때 정수면 같다고 나올것이고

소수면 틀리다고 나올것이다

즉 121이 들어오면 x 는 11.0 이고 intValue하면 11 이니까 둘은 같다고 되는거고

3이 들어오면 x는 1.73205080 등 이고 intValue하면 1이니까 둘은 다르다고 되는거다

 

그래서 같으면 Math.pow를 이용해서 거듭 제곱을 만들어주고

answer가 long 타입이니 형변환해서 반환해준다

 

public class Solution {
    public static void main(String[] args) {
        long answer = 0;
        long n = 3;

        Double x = Math.sqrt(n);

        if(x == x.intValue()){
            answer = (long)Math.pow(x+1 , 2);
        }else{
            answer = -1;
        }
        System.out.println(answer);
    }
}