Algorithm/Baekjoon
[백준] 1929 소수 구하기
밍츠
2022. 7. 14. 14:29
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
에라토스테네스의 체
- 여러 개의 수가 소수인지 아닌지를 판별할 때 사용하는 대표적인 알고리즘
- N보다 작거나 같은 모든 소수를 찾을 때 사용
- 시간복잡도는 O(NloglogN)으로 선형 시간에 동작할 정도로 빠르지만 메모리가 많이 필요하여 1,000,000 이내로 주어지는 경우에 사용한다. (1,000,000 -> 400만 번 정도의 연산)
import math
n, m = map(int,input().split())
array = [True for i in range(1000001)]
array[1] = 0
for i in range(2,int(math.sqrt(m))+1):
if array[i] == True:
j = 2
while i*j <=m:
array[i*j] = False
j+=1
for i in range(n,m+1):
if array[i]==True:
print(i)
step1)
- M,N의 최대 범위인 100000을 고려하여 1000001 크기의 배열을 만든다
- 이 배열은 소수인지 아닌지 확인하는 용도이다.
step2)
- 2부터 M의 제곱근까지 반복하면서 해당 수의 배수를 False로 만들어준다.
[point]
- 1은 소수가 아니기 때문에 제외한다.
- j = 2부터 시작하여, 자기자신은 제외한다. (소수가 아니라면 배수를 False로 만드는 과정을 통해 처리됨)
- M의 제곱근까지 반복을 진행한다.
ex) 15의 약수는 1,3,5,15 인데 15의 제곱근인 3.xx 에서 정수형으로 바꾼 3까지만 확인해도 15가 소수가 아닌 것을 확인할 수 있기 때문이다.
-> 그래서 최대 수인 M의 제곱근까지 확인
step3)
- 찾고싶은 범위인 N~M에서 값이 TRUE인 인덱스 번호를 출력한다.