[Python] BOJ 1929 - 소수 구하기(에라토스테네스의 체)
728x90
반응형
백준 1929번
https://www.acmicpc.net/problem/1929
* prime함수 : n을 매개변수로 넘겨받아 1부터 n-1까지 n%i = 0이면 a에 1을 더해줘서 최종적으로 a가 1이면
(모든 수는 1로 나누어지므로 모든 수의 a는 최소1이다) 소수 -> True 반환
* a,b를 입력받아 list1에 소수인 것들만 append해줬다.
* a와 b가 100만까지 들어오다보니 이 방법으로는 시간초과가 발생하였다.
* 따라서 새로운 방법인 '에라토스테네스의 체'를 사용해보았다.
import math
def get_primes(a,b):
# a부터 b사이의 소수를 구해야하지만 어쨋든 b칸의 리스트필요
is_primes = [True] * b
# b의 최대 약수가 sqrt(b)이하이므로 계산한 후, 소숫점이 있을 경우 올림으로 최대 반복횟수 계산
max_length = math.ceil(math.sqrt(b))
for i in range(2, max_length):
# True일 경우, 소수
if is_primes[i]:
# i이후 i의 배수들 False처리 (이해 잘안가면 링크참고)
for j in range(i+i, b, i):
is_primes[j] = False
# 리스트의 True로 남아 있는 인덱스(소수)를 추출
return [i for i in range(a, b) if is_primes[i]]
a,b = map(int,input().split())
# a가 1일때 1부터 출력이 되므로 if문으로 나누어 주었다.(이 부분은 나중에 실력더 기르고 최적화시킬 것.)
if(a == 1):
print(*get_primes(2,b+1), sep="\n")
else:
print(*get_primes(a,b+1), sep="\n")
성공!
728x90
반응형
'문제풀이 > BaekjoonOnlineJudge' 카테고리의 다른 글
[Python] BOJ 5430 - AC(deque) (0) | 2020.02.12 |
---|---|
[Python] BOJ 1966 - 프린터 큐(Queue) (0) | 2020.02.11 |
[Python] BOJ 1158 - 요세푸스 문제(Circular Linked List) (0) | 2020.02.11 |
[Python] BOJ 1406 - 에디터(Doubly Linked List) (0) | 2020.02.08 |
[Python] BOJ 1920 - 수 찾기(Binary Search) (0) | 2020.01.27 |
TAGS.