소수(Prime Number) 판별 알고리즘: 에라토스테네스의 체
소수(Prime Number)를 다루는 두 가지 알고리즘
2026.03.17
DecimalAlgorithm
코딩 테스트나 백준 문제 풀이에서 소수(Prime Number)를 다룰 때는 크게 단일 숫자가 소수인지 판별할 때와 특정 범위 안의 모든 소수를 찾을 때 두 가지 상황으로 나뉩니다. 상황에 맞게 다음 두 가지 알고리즘을 사용하시면 됩니다.
1. 단일 숫자 소수 판별 ()
어떤 수 하나가 주어졌을 때, 이 수가 소수인지 확인하는 가장 정석적인 방법입니다. 2부터 까지 전부 나눠볼 필요 없이, 의 제곱근()까지만 나눠봐도 충분합니다. 약수는 항상 대칭을 이루기 때문에 제곱근까지만 확인해도 시간 복잡도를 으로 대폭 줄일 수 있습니다.
pythonimport math
def is_prime(n):
# 0과 1은 소수가 아님
if n < 2:
return False
# 2부터 n의 제곱근까지만 확인
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False # 나누어 떨어지면 소수가 아님
return True # 모두 통과하면 소수
2. 특정 범위 안의 모든 소수 찾기 ()
"1부터 100만까지의 소수를 모두 구하라"와 같이 다수의 소수를 한 번에 찾아야 할 때는 에라토스테네스의 체(Sieve of Eratosthenes) 를 무조건 사용해야 시간 초과를 피할 수 있습니다. 마치 체로 걸러내듯, 소수를 하나 찾으면 그 소수의 배수들을 모두 지워나가는 아주 빠르고 효율적인 방식입니다.
pythonimport math
def sieve_of_eratosthenes(n):
# 처음엔 0, 1을 제외한 모든 수를 소수(True)로 간주
is_prime = [True] * (n + 1)
is_prime[0] = False
is_prime[1] = False
# n의 제곱근까지만 배수들을 지워주면 됨
for i in range(2, int(math.sqrt(n)) + 1):
if is_prime[i]: # i가 소수라면
# i의 배수들을 모두 False(소수가 아님)로 처리
# (i*2 대신 i*i부터 시작해도 무방함)
for j in range(i * i, n + 1, i):
is_prime[j] = False
# True로 남아있는 인덱스(숫자)만 리스트로 뽑아냄
return [i for i in range(2, n + 1) if is_prime[i]]
# 사용 예시: 50까지의 소수 구하기
primes = sieve_of_eratosthenes(50)
print(primes)
요약 비교 테이블
| 구분 | 제곱근 판별법 | 에라토스테네스의 체 |
|---|---|---|
| 목적 | 특정 숫자 하나가 소수인지 확인할 때 | 특정 범위의 모든 소수를 미리 구해둬야 할 때 |
| 시간 복잡도 | ||
| 장점 | 메모리가 거의 안 들고 로직이 간단함 | 한 번 구해두면 이후에 배열 접근(O(1))만으로 판별 가능 |
| 단점 | 여러 개의 숫자를 일일이 검사하려면 느림 | 범위 크기만큼의 배열 공간(메모리)이 추가로 필요함 |