Post

에라토스테네스의 체 (부제 - 지나고 보니 별거 아니네!)

에라토스테네스의 체의 설명과 관련 문제 풀이 - 백준 1645

에라토스테네스의 체 (부제 - 지나고 보니 별거 아니네!)

에라토스테네스의 체

약 4년 전, 1학년 과목이었던 ‘프로그래밍 원리 및 실습’ 과목에서 마주쳤던 기억이 어렴풋이 난다. 그때는 이름부터 어려워 구글링한 코드를 대충 외웠던 거 같은데…ㅎㅎ 지나고 보니 아주 간단한 알고리즘이었다. 그때는 chatGPT가 없던 구글링만 존재하던 낭만의 시절이었다.

에라토스테네스의 체는 소수를 구하기 위한(특히 N 이하의 모든 소수를 구할 때) 알고리즘이다. 1. 합성수는 특정 소수의 배수라는 아이디어와 2. 합성수의 약수를 찾기 위해서는 √n까지만 나누어 보면 된다는 두 가지 아이디어가 합쳐진 방식이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//주어진 입력 N이하의 모든 소수를 구하기

import java.io.*;
public class Eratosthenes {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

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

        for(int i = 2 ; i <= N ; i ++ ){
            numbers[i] = true;
        }

        for(int i = 2 ; i <= Math.sqrt(N) ; i ++ ){
            if(numbers[i]){
                int num = i * 2;
                while(num <= N){
                    numbers[num] = false; // 소수의 배수 지우기
                    num += i;
                }
            }
        }

        for(int i = 0 ; i < N + 1 ; i ++ ){
            if(numbers[i]){
                System.out.print(i + " ");
            }
        }

    }
}

백준 1644

이 문제는 연속되는 소수들의 합으로 특정수를 만들 수 있는 경우의 수를 찾는 문제로, 1. 주어진 수(N) 이하의 소수를 찾고 2. 슬라이딩 윈도우 알고리즘을 활용해 연속된 합을 구해 특정수를 만들 수 없는지를 판별하면 되는 문제이다.

주의할 점 : 주어진 N 이하의 소수가 없는 경우

This post is licensed under CC BY 4.0 by the author.