처음엔 문제를 보고 시간제한도 2초길래
이전에 햇던 코드 조금만 변형하면 되지 않나? 라고 생각했었는데
어림도없다!
그래서 기존 질문들을 뒤져보던 와중에
에라스토테네스? 의 체? 를 쓰면
큰수에서 획기적으로 시간을 줄일 수 있다고 해서
관련된 내용을 한번 찾아봤따
2. 소수 구하기 - 에라토스테네스의 체
# 소수 : 1과 그 수 자신 이외의 자연수로는 나눌 수 없는 자연수이다. # 코딩 소수인지 검사하는 함수(isPrime)를 만든다. 1부터 100 사이의 소수를 구하는 ...
wikidocs.net
위키독스에 잘 나와있다
에라토스테네스였네 ㅋㅋ
위키독스 내용을 빌려오자면
1. 1은 제거
2. 지워지지 않은 수 중 제일 작은 2를 소수로 채택하고, 나머지 2의 배수를 모두 지운다.
3. 지워지지 않은 수 중 제일 작은 3을 소수로 채택하고, 나머지 3의 배수를 모두 지운다.
4. 지워지지 않은 수 중 제일 작은 5를 소수로 채택하고, 나머지 5의 배수를 모두 지운다.
5. (반복)
이정도가 되겠다.
n=1000
a = [False,False] + [True]*(n-1)
primes=[]
for i in range(2,n+1):
if a[i]:
primes.append(i)
for j in range(2*i, n+1, i):
a[j] = False
print(primes)
대충 이런 코드라고 하는데
지금 이건 1부터 n까지의 에라토스테네스의 체여서
변형을 시키긴 해야겠다
....
지금 글 쓰면서 코드를 만지고 있는데
저거 왜 false false 가 들어가는거야??
0,1 을 제낀거냐 아니면
1,2 를 제낀거야 뭐 왜 저렇게된거임?
if a[i] 가 있는걸보니까 일단 2는 처음에 들어가야하고
그럼 0,1 을 제낀거같은데...
그럼 0,1 을 앞에 깔고 인덱스는 end + 1 이 되서 코드를 짜보면
#https://www.acmicpc.net/problem/1929
def pn(n,m) :
if n==1 : start=2
else : start=n
end=m
a = [False,False] + [False]*(start-2) + [True]*(end-1-(start-2))
#print(a)
primes=[]
for i in range(2,end+1):
if a[i]:
primes.append(i)
for j in range(2*i, end+1, i):
a[j] = False
return primes
_n, _m=map(int, input().split())
pn_ls=pn(_n,_m)
for i in pn_ls :
print(i)
뭐 이정도 될것 같고 주피터에서 잘 출력되서 백준에서 돌려보니까
print 주석처리 잘 했는데 뭐가 출력초과라는거지...?
라고하던 와중에 3 10 을 입력하니
3 4 5 7이 출력된다...
4는 왜거기 기어들어가있누...
a를 건드리는게 아니라 a리스트는 놔두고
이후 인덱스로 접근해봐야겠다
#https://www.acmicpc.net/problem/1929
def pn(n,m) :
start=n
end=m
a = [False,False] + [True]*(end-1)
#print(a)
primes=[]
for i in range(2,end+1):
if a[i]:
if i>=start :
primes.append(i)
for j in range(2*i, end+1, i):
a[j] = False
return primes
_n, _m=map(int, input().split())
pn_ls=pn(_n,_m)
for i in pn_ls :
print(i)
배열에 추가하는데만 조건문을 하나 더 달아줬는데
분명 시간소요가 더 되는건 아쉽지만
지금 시간? 점심시간 20분전 ㅋㅋ
빨리 포스팅 끝내버리고 밥 각
https://github.com/cyanindy/baekjoon_online_judge/blob/main/python3/step9/1929.py
GitHub - cyanindy/baekjoon_online_judge: https://www.acmicpc.net/
https://www.acmicpc.net/ . Contribute to cyanindy/baekjoon_online_judge development by creating an account on GitHub.
github.com
'파이썬 > 알고리즘' 카테고리의 다른 글
fail(timeover) - Baekjoon 8단계-9 / 1011번 Fly me to the Alpha Centauri python3 (0) | 2022.02.07 |
---|---|
success - Baekjoon 9단계-5 4948번 베르트랑 공준 python3 (0) | 2022.02.07 |
success - Baekjoon 8단계-6 / 2775번 부녀회장이 될테야 python3 (0) | 2022.02.03 |
success - Baekjoon 9단계-2 / 2581번 소수 python3 (0) | 2022.01.27 |
success - Baekjoon 9단계-1 / 1978번 소수 찾기 python3 (0) | 2022.01.26 |