에라토스테네스의 체 — 소수 판별

JayJi·2026년 4월 4일

알고리즘

목록 보기
10/30

관련 문제

문제난이도핵심
1929번 — 소수 구하기실버 III기본 구현
2960번 — 에라토스테네스의 체브론즈 IK번째 지워지는 수
6588번 — 골드바흐의 추측실버 I소수 목록 활용

1. 개념

N 이하의 모든 소수를 찾는 알고리즘이다. 핵심 아이디어는 단 하나다.

소수의 배수는 소수가 아니다.

2부터 시작해서 소수를 발견할 때마다 그 배수를 전부 제거한다. 남은 수가 모두 소수다.


2. 동작 과정

N = 16 기준

단계기준수 p제거 대상이유
1244, 6, 8, 10, 12, 14, 162의 배수
2399, 153의 배수 (6, 12는 이미 제거됨)
3416skip4는 합성수 (2가 이미 처리)
4525루프 종료5² = 25 > 16

최종 소수: 2, 3, 5, 7, 11, 13


3. 핵심 포인트 2가지

바깥 루프가 p * p <= N 인 이유

√N 이상의 수의 배수는 더 작은 소수가 이미 처리했기 때문이다.

  • p = 5일 때, 5×2=10 → 2가 처리, 5×3=15 → 3이 처리
  • √N보다 큰 수는 할 일이 없다.

안쪽 루프가 p * p 부터인 이유

p² 미만의 배수는 더 작은 소수가 이미 제거했기 때문이다.

  • p = 5일 때, 5×2, 5×3, 5×4는 각각 2, 3, 2가 처리
  • 새로 처리할 것은 5×5 = 25부터다.

4. 코드

boolean[] isComposite = new boolean[N + 1]; // 합성수면 true

for (int p = 2; p * p <= N; p++) {          // p를 2부터 √N까지
    if (!isComposite[p]) {                   // p가 소수라면
        for (int m = p * p; m <= N; m += p) { // p²부터 p씩 건너뛰며
            isComposite[m] = true;            // 배수를 합성수로 표시
        }
    }
}

// isComposite[i] == false 인 i (2 이상) 가 소수

5. 1929번 적용 코드 (M 이상 N 이하 소수 출력)

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        boolean[] isComposite = new boolean[N + 1];

        for (int p = 2; p * p <= N; p++) {
            if (!isComposite[p]) {
                for (int m = p * p; m <= N; m += p) {
                    isComposite[m] = true;
                }
            }
        }

        for (int i = M; i <= N; i++) {
            if (i >= 2 && !isComposite[i]) {  // 2 이상이면서 합성수가 아닌 것
                sb.append(i).append("\n");
            }
        }

        System.out.print(sb);
    }
}

6. 시간복잡도

방법시간복잡도
단순 소수 판별 (매번 계산)O(N√N)
에라토스테네스의 체O(N log log N)

N이 클수록 차이가 극적으로 벌어진다. N = 1,000,000 이상이면 반드시 체를 사용해야 한다.


7. 주의사항

  • 1은 소수도 합성수도 아니다. i >= 2 조건을 반드시 확인한다.
  • isComposite 배열은 N + 1 크기로 선언한다 (인덱스 N까지 사용).
  • p * p가 int 범위를 초과할 수 있는 경우 (long) p * p로 캐스팅한다.
profile
Java와 SpringBoot를 이용한 백엔드 개발자가 되려고 합니다.

0개의 댓글