👄 Language/JAVA

[JAVA] 자바로 숫자의 약수 갯수 구하기

Nyan cat 2022. 11. 18. 09:28

📌  자바로 숫자의 약수 갯수 구하기

자바로 특정 숫자의 약수 갯수 구하는 방법 

숫자 n의 약수 갯수를 구한다고 할 때 1부터 시작해서 1씩 더해가면서 n을 나눈 나머지가 0이 되면 약수이니까 1씩 더해 주면 된다.

이게 가장 정석적이고 보편적인 풀이이다.

public int countDivisor(int n) {
	int answer = 0;
    
    for (int i = 0; i <=n; i++) {
    	if (n % i == 0) {
        	answer++;
        }
    }
}

그런데 n이 커지면 커질 수록 약수의 갯수를 구하는 데 걸리는 시간도 길어진다.

(예를 들어 n이 2944231이라면 2944231번 약수가 맞는지 계산해야 한다.)

시간 복잡도를 잡아먹는다. 

특히나 효율성도 확인하는 코테에서는 1씩 더해가면서 순회할 때 시간초과가 나기도 한다.

이런 경우를 위해서 약수의 갯수를 구하는 데 사용되는 시간을 줄이는 법이 있다.

 

📌  자바로 숫자의 약수 갯수 더 빨리 효율적으로 구하기 

1부터 n의 제곱근까지만 확인해서 약수의 갯수를 알아내는 방법이다.

예를 들어 n의 약수 a를 구했다고 할 때 a에는 항상 곱했을 때 n이 되는 짝꿍인 b가 있다. 

 

그렇기 때문에 n의 제곱근까지만 순회해서 약수의 갯수를 구하면 해당 약수의 갯수는 그 2배가 된다는 것을 알 수 있다. 

이 때 주의해야 할 점은 제곱근인 경우이다. 

예를 들어 16의 약수의 갯수를 구할 때 4는 16의 제곱근이므로 약수 1개만 더해주어야 한다.

 

해당 부분만 분기처리하면 훨씬 빠르게 약수의 갯수를 구할 수 있다.

public int countDivisor(int n) {
	int answer = 0;
    
    for (int i = 0; i <= n * n; i++) {
    	if (n % i == 0) {
        	
            if (i * i == n) {
            	answer++;
            } else {
            	answer += 2;
            }
        }
    }
}
반응형

'👄 Language > JAVA' 카테고리의 다른 글

[JAVA] 자바로 랜덤 값 받기 (Random Class)  (0) 2022.11.08
[JAVA] 자바로 절대값 구하기  (0) 2022.10.12