본문 바로가기
Develop/백준 (python)

[백준] 1929번: 소수 구하기 (python)

by Tarra 2022. 1. 31.

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을 걸러내지 못한다.

따라서 더욱 검색을 해보고 아래 문서와 위키백과의 에라토스테네스의 체를 다시 보고 코드를 짰다.

거의 배낀 것 같은 느낌이 들지만.

 

 

 

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 이하라고 했기 때문.
 
= 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