소수를 구하는 알고리즘 - 에라토스테네스의 체
고대 그리스의 수학자 에라토스테네스가 만들어 낸 소수를 찾는 방법
알고리즘[편집]
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다. (보라색)
그림의 경우, 11^2 > 120
이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.
* 소수가 되는 수의 배수를 지우면 남은 건 소수가 된다
* 소수가 무엇인지 찾을 필요 없이 2부터 자기 자신을 제외한 배수가 되는 것을 지우면 된다.
코드
package com.java.coding;
public class EratosExam {
static boolean isPrime[];
public static void main(String[] args) throws Exception{
isPrime_func(120); //120 소수 찾기
}
public static void isPrime_func(int n){
isPrime = new boolean[n+1]; // N번째의 수 까지 받기위해 N+1까지 동적할당
for(int i = 0; i < isPrime.length; i++){
isPrime[i] = true; // boolean배열의 default값은 false이므로 true로 바꿔주기
}
// 0과 1은 소수가 아니니깐 false
isPrime[0] = isPrime[1] = false;
// 2부터 n의 제곱근까지의 모든 수를 확인
// or i*i<=n
for(int i = 2; i <= Math.sqrt(n); i++){
// 해당수가 소수라면, 해당수를 제외한 배수들을 모두 false 처리하기
if(isPrime[i]){ // 2,3,5,7
//그 이하의 수는 모두 검사했으므로 i*i부터 시작
for(int j = i*i; j<= n; j += i){
isPrime[j] = false;
}
}
}
// 소수 출력
for(int i=1; i<=n;i++){
if(isPrime[i]) System.out.print(i+" ");
}
}
}
참고
'코테 > 개념 정리' 카테고리의 다른 글
재귀, 이진탐색(Binary Search), 백트래킹(Backtracking) (1) | 2023.12.31 |
---|---|
시간복잡도, 정렬 알고리즘 (1) | 2023.12.31 |
DFS( Depth first Search) - 깊이 우선 탐색 (1) | 2023.12.27 |
BFS (Breadth First Search ) - 너비 우선 탐색 (0) | 2023.12.27 |
Java 정렬과 Lamda 사용의 정렬 (0) | 2023.12.25 |