본문 바로가기
알고리즘/코드 저장

[JAVA] 소수 찾기

by 이민우 2020. 4. 4.
728x90
반응형

소수란 1과 자기 자신을 제외하고는 약수가 없는 수이다.

 

소수를 찾는 가장 기초적인 방법은 2~n-1 까지 반복문을 돌리거나, 혹은 2~n/2 까지 반복문을 돌리며 나누어봄으로써 소수를 찾을 수 있겠지만, 당연히 이는 효율적이지 못한 방법이다.

 

하지만 아래의 방법을 사용하면 않고 √n까지 나누면 소수인지 알 수가 있다.

이 방법은 O(√n)의 시간 복잡도를 가진다.

boolean isPrime(int n) 
{
	if(n<2) return false;
	for(int i=2; i*i <= n; i++ ) {
		if(n%i ==0) return false;
	}
	return true;
}

 

 

추가로 소수 열을 찾는 방법은 에라토스테네스의 체 알고리즘을 사용하면 빠르게 구할 수 있다.

int[] Eratosthenes(int n) 
{
	Boolean[] dp = new Boolean[n]; // 소수 여부 배열
   	dp[0] = dp[1] = true; // 0,1은 소수가 아니므로 true
   	List<Integer> prime = new LinkedList<Integer>();
   	for(int i=2; i<n; i++) {
   		if(dp[i]) continue;			//소수가 아니라면 continue
   		prime.add(i);				//소수라면 리스트에 추가
   		for(int j=i*2; j<n; j+=i) dp[j] = true;	//소수의 배수는 소수가 아님
   	}
   	int[] ret = new int[prime.size()];
   	int count = 0;
   	foreach (int num:prime) ret[count++] = num;
   	return ret;
}

 

728x90
반응형

'알고리즘 > 코드 저장' 카테고리의 다른 글

[JAVA] 최대공약수, 최소공배수 찾기  (0) 2020.04.04