1929번: 소수 구하기
문제)
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력 :
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력 :
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
풀이)
처음에 푼 풀이. 문제를 보자마자 에라토스테네스의 체가 생각나서 구글링을 해보았고,
https://ko.wikipedia.org/wiki/에라토스테네스의_체
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서
ko.wikipedia.org
를 기반으로 코드를 만들어 보았다. 다음은 그렇게 만들어진 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import sys
n, m = map(int, sys.stdin.readline().split(" "))
li = []
for i in range(n, m+1):
li.append(i)
for i in li:
if i == 1:
pass
elif i != 2 and i % 2 == 0:
pass
elif i != 3 and i % 3 == 0:
pass
elif i != 5 and i % 5 == 0:
pass
elif i != 7 and i % 7 == 0:
pass
else:
print(i)
|
cs |
답은 당연히 틀리게 나왔다. 이 코드에서 내가 놓친 점은 숫자가 커질 경우 놓치는 소수가 발생하기 때문이었다.
예를 들어 121의 경우 11*11이므로 소수가 아니지만 위 코드에서는 11을 걸러내지 못한다.
따라서 더욱 검색을 해보고 아래 문서와 위키백과의 에라토스테네스의 체를 다시 보고 코드를 짰다.
거의 배낀 것 같은 느낌이 들지만.
글 읽기 - ★☆★☆★ [필독] 소수 구하기 FAQ ★☆★☆★
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
나무위키의 에라토스테네스의 체에 대한 설명 중 일부
1
2
3
4
5
6
7
8
9
10
11
12
13
|
n, m = map(int, input().split(" ")) # 입력 받기
sieve = [True] * (m+1) #1 부터 m+1까지의 True로 이루어진 리스트
# m+1을 사용하는 이유는 문제에서 m 이하라고 했기 때문.
o = int((m+1) ** 0.5) #(m+1) ** 0.5까지의 수만 확인하면 됨.
for i in range(2, o + 1): # 2부터 확인 시작
if sieve[i] == True:
for j in range(i+i, m+1, i): #예를 들어 3일때, 6부터 3의 배수를 제거
sieve[j] = False
for i in range(n, m+1): #Ture값의 인덱스로 출력함.
if sieve[i] == True and i != 1:
print(i)
|
cs |
출처 : https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
'Develop > 백준 (python)' 카테고리의 다른 글
[백준] 11728번: 배열합치기 (python) (0) | 2022.02.02 |
---|---|
[백준] 18111번: 마인크래프트 (python) (0) | 2022.02.01 |
[백준] 1018번: 체스판 다시 칠하기 (python) (0) | 2022.01.30 |
[백준] 2805번: 나무 자르기 (python) (0) | 2022.01.30 |
[백준] 1966번: 프린터 큐 (python) (0) | 2022.01.30 |