정의
1부터 N까지의 소수를 빠르게 구하는 대표 알고리즘입니다.
수학 개념
왜 “배수 지우기”가 소수를 남기는가
합성수는 반드시 “어떤 소수의 배수”다
왜 i×i부터 지워도 되는가
알고리즘 개념
동작 과정: “남은 수를 소수로 확정하고 배수 지우기”
단계형 요약
구현
Java로 구현하기 (실전형 템플릿)
(2) 반복 조건은 i*i <= N 형태로 (sqrt 호출 생략)
(3) N이 매우 크면 boolean[] 메모리(O(N))를 고려
import java.util.*;
public class SieveEratosthenes {
// isPrime[i] == true => i는 소수
static boolean[] sieve(int n) {
boolean[] isPrime = new boolean[n + 1];
if (n < 2) return isPrime;
Arrays.fill(isPrime, true);
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) { // i가 소수면
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false; // i의 배수는 합성수
}
}
}
return isPrime;
}
public static void main(String[] args) {
int N = 30;
boolean[] isPrime = sieve(N);
List<Integer> primes = new ArrayList<>();
for (int i = 2; i <= N; i++) {
if (isPrime[i]) primes.add(i);
}
System.out.println(primes); // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
}
}
코테 포인트
자주 틀리는 지점(실수 방지)
요약
체크리스트로 마무리