에라토스테네스의 체(Sieve of Eratosthenes)
에라토스테네스의 체는 고대 그리스의 수학자 에라토스테네스가 고안한 소수 판별 알고리즘이다.
이 알고리즘은 2부터 시작하여 특정 숫자의 배수를 지워 나가는 방식으로 소수를 찾는다.
작동 원리
- 2부터 N까지의 모든 정수를 나열한다.
- 나열된 정수 중 남아 있는 가장 작은 숫자를 찾고, 이를 소수로 마킹한다.
- 이 숫자의 배수들을 모두 리스트에서 제거한다.
- 리스트에 남아 있는 숫자 중 가장 작은 수를 찾아 위의 과정을 반복한다.
- 리스트에 더 이상 제거할 수가 없을 때까지 반복한다.
구현 in C++
#include <iostream>
using namespace std;
//2~1000까지 소수를 찾아 테이블에 마킹한다
#define MAX 1000
bool table[MAX+1];
int main()
{
//조건문 i*i
for (long long i = 2; i * i <= MAX; i++)
{
if (!table[i])
{
for (long long j = i * i; j <= MAX; j += i)
{
table[j] = 1;
}
}
}
for (long long i = 2; i < MAX; i++)
{
if (!table[i])
{
cout << i << " ";
}
}
return 0;
}
- 위 코드는 i*i를 조건부에 사용한다. 에라토스테네스의 체에서 반복문의 조건에 i * i를 넣는 이유는 효율성을 높이고 불필요한 계산을 줄이기 위해서이다.
- 예를 들어, 숫자 n에 대해 모든 배수를 지우는 작업을 할 때, 숫자 i의 배수 i * k(여기서 k는 i보다 큰 어떤 수)의 경우 이미 이전 단계에서 처리되었다. (ex: i = 3일 때 3 * 2 = 6과 같은 수는 이미 i = 2일 때 처리되었다.)
- 따라서 i의 배수를 지우는 작업을 할 때, i가 커질수록 더 많은 수가 이미 지워져 중복 처리가 발생한다. 이를 피하기 위해 i * i까지의 배수들만 처리하면 충분하다.
문제 추천
https://www.acmicpc.net/problem/1929
https://www.acmicpc.net/problem/4948
https://www.acmicpc.net/problem/2960
https://www.acmicpc.net/problem/17103
https://www.acmicpc.net/problem/1153
'자료구조 & 알고리즘' 카테고리의 다른 글
알고리즘: 카데인 알고리즘 (Kadane's algorithm) (0) | 2024.09.10 |
---|---|
자료구조: Trie(자료구조) (1) | 2024.08.12 |
알고리즘: Boyer-Moore 과반수 투표 알고리즘 (1) | 2024.06.11 |
알고리즘: DFS, BFS (너비우선탐색, 깊이우선탐색) (1) | 2024.06.06 |
알고리즘: Knapsack(배낭 알고리즘) (2) | 2024.06.04 |