문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
풀이
def isSosu(v):
for i in range(2, int(v**0.5)+1):
if v%i==0: return 0
return 1*(v!=1)
a,b=map(int, input().split())
for i in range(int(a),int(b)+1):
if isSosu(i)==1:
print(i)
isSoSu function을 정의하여 각 값이 소수인지 아닌지 판별한다.
이 때, range를 2~v 로 설정하면 시간초과가 뜨기 때문에 sqrt(v)로 설정해줄 것!
백준 1929번 파이썬 풀이: 소수 구하기 (tistory.com)
사용된 개념
에라토스테네스의 체
일정 범위내 수열에서 배수들을 제거해 소수만 남기는 방법
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
그림의 경우, 11² > 120 이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.
-파이썬으로 구현
def prime_list(n):
# 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
sieve = [True] * n
# n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
m = int(n ** 0.5)
for i in range(2, m + 1):
if sieve[i] == True: # i가 소수인 경우
for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
sieve[j] = False
# 소수 목록 산출
return [i for i in range(2, n) if sieve[i] == True]
제곱근 이용
루트를 하는 방식:당연하게도 제곱(**)을 이용
# 2의 루트
print("2의 루트 : ", 2**(1/2))
2의 루트 : 1.4142135623730951
'Algorithm > Python' 카테고리의 다른 글
백준 - 2805 - 나무 자르기 - Python/이분탐색 (0) | 2021.03.09 |
---|---|
백준 - 11651 - 좌표 정렬하기 2 - Python/sorted (0) | 2021.03.09 |
백준 - 4673 - 셀프 넘버 - Python/sort, list, for문 활용 (0) | 2021.03.08 |
백준 - 1157- 단어공부 - Python / set, count 함수 (0) | 2021.03.08 |
백준 - 2941 - 크로아티아 알파벳 - Python /문자열 (0) | 2021.03.06 |
댓글