728x90
1. 문제 설명
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
- 입력
- 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
- 출력 :한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
2. 코드
import sys
input = sys.stdin.readline
# 1000000(백만) 이하의 자연수 이다.
p = 10 ** 6
# 0, 1 은 소수가 아니므로 리스트 형태에서 False 표시 해준다.
# 이후 2 ~ 1000000(백만) 까지 모든 숫자들은 True 표시 해둔다.
# 이때 p - 1 를 한 이유는 앞서 0, 1 의 길이 즉 2만큼 소수가 아님을 표시 해줬기 때문이다.
# 그래서 p - 1 의 길이 만큼만 True 표시를 해주면 길이는 1000001 이다.
prime = [False, False] + [True] * (p - 1)
# 에라토스테네스의 체를 이용한 방식이다.
# i 값의 범위를 10 ** 6 절반인 10 ** 3 까지만 돌려도 된다.
for i in range(1, int(p ** 0.5) + 1):
# 소수인지 판별!!
if prime[i]:
# 만약 i 가 소수라면 i의 배수들은 소수가 아님을 이용한 반복문이다.
for j in range(2 * i, p + 1, i):
prime[j] = False
m, n = map(int, input().split())
for i in range(m, n + 1):
if prime[i]:
print(i)
3. 회고
Q. 문제를 보고 든 생각
- 에라토스테네스의 체를 이용하여 소수를 판별 하고자 했다.
- 일반적인 소수 판별 시간복잡도는 O(N)값이다. 하지만 판별하고자 하는 소수의 범위의 제곱근 값 즉, n = 10000, n의 제곱근인 100 까지를 이용하여 소수 판별하는 알고리즘의 시간복잡도는 O(N^(1/2)) 이지만 여전히 n 값이 크면 시간복잡도가 상당히 높은것을 나타 낼수 있다.
- 이를 보완하고자 나온 알고리즘이 에라토스테네스의 체이다.
- 이를 이용하여 문제를 풀어보고자 했다.
4. 고쳐야 할점
더 좋은 방법이 있다면 댓글로 알려주세요!!!
728x90
'Algorithm > Python' 카테고리의 다른 글
백준 6588번 골드바흐의 추측 (0) | 2023.01.05 |
---|---|
백준 4375번 1 (0) | 2023.01.05 |
백준 1978번 소수 찾기 (0) | 2023.01.05 |
백준 1934번 최소공배수 (0) | 2023.01.05 |
백준 2609번 최대공약수 와 최소공배수 (0) | 2023.01.05 |