컴퓨터 프로그래밍/알고리즘

[알고리즘][Java] 정수 제곱근 판별, 오버플로우

한33 2024. 8. 12. 10:09

class Solution {
    public long solution(long n) {

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

 

정수의 제곱근을 판별하는 문제에서의 포인트

 

1. 오버플로우

n 의 제곱근인 x 라면 굳이 long 타입으로 선언해주어야할까?

int 로 x 를 선언해주었을 때

(int 변수) * (int 변수) 의 결과가 (int 변수) 의 범위를 초과하면 오버플로우가 발생할 수 있음.

예를 들어, int 의 최대값인 2,147,483,647 에 1을 더하면 -2,147,483,648로 변환됨

 

2. 필요없는 계산 줄이기

기존에 반복문의 범위를 x<=n 으로 설정을 했었다.

근데 어차피 x*x 가 n 보다 넘어간다면 더 이상 제곱근이 될 수가 없기 때문에

이를 미리 생각해서 필요없는 계산을 사전에 없애서 성능 향상을 기대해볼 수 있었을 것 같다.