알고리즘/프로그래머스

정수 제곱근 판별(JAVA)

mrban 2022. 1. 19. 15:49

1. 문제

양의 정수 n을 매개변수로 하여 n의 제곱근을 찾는다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하시오.

 

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

 

3. 정답
class Solution {
    public long solution(long n) {
        long answer = 0;

        for (long i = 1; i*i <= n; i++) {
            if (i * i == n) {
                answer = (i + 1) * (i + 1);
            }
        }
        if (answer == 0) {
            answer = -1;
        }
        return answer;
    }
}
 

4. 설명

4-1. for문을 사용하여 1부터 하나씩 증가시켜나가며 n의 제곱근을 구한다. 범위는 숫자의 제곱이 n보다 작거나 같을때까지 반복문을 돌린다.

4-2. for문을 통해 제곱근을 찾았다면 1을 더해주고 그 값의 제곱값을 return한다.

4-3. for문을 돌렸지만 제곱근을 찾지 못했다면 -1을 return한다.

 

5. 참고

5-1. n이 50000000000000까지 될 수 있기 때문에 for문에서 i * i 값이 엄청나게 커질 가능성이 높다. 따라서 i도 int형이 아닌 long형으로 선언하였다.

5-2. 제곱근을 구하는 함수 sqrt()가 존재하는지 모르고 직접 만들어서 풀었다. 정답이긴 하지만 시간효율 측면에서는 sqrt()함수를 쓰는 것이 훨씬 빠르다. 

class Solution {
    public long solution(long n) {
        long answer = 0;
        double square_root;
        
        square_root = Math.sqrt(n);
        if (square_root % 1 == 0) {
            answer = (long)((square_root + 1) * (square_root + 1));
        }
        else {
            answer = -1;
        }
        return answer;
    }
}

5-3. 제곱을 구하는 함수 pow()도 있긴 하지만 지금 문제에서는 굳이 직접 계산하는 것과 차이는 없을 것으로 보여 사용하지 않았다.