[Python 파이썬]백준 1990번 소수인팰린드롬 풀이
백준 1990번 소수인팰린드롬 문제다.
소수 문제를 보면 항상 에라토스테네스의 체가 먼저 떠오르는데,
뭔가 에라토스 테네스의 체 하면 정석으로 떠오르는
primes = [False, False] + [True] * (n-1) for i in range(2, n+1): if primes[i]: print(i) for j in range(2*i, n+1, i): primes[j] = False
로 풀면 배열 길이가 1억 개라서 많이 힘들다... (시간 초과도 시간 초과고 메모리 초과도 나올 거 같다...)
아니 아무튼 이걸로 한 번 돌려보면
소수로 팰린드롬을 이루는 경우 중에 자릿수가 짝수인 팰린드롬 소수는 '11' 밖에 존재하지 않는다(?)는 걸 알 수 있는데 이걸로 범위를 확 줄여줄 수 있다.
n, m = map(int, input().split()) if m >= 10000000: m = 10000000 if 1000000 >= m >= 100000: m = 100000 if 10000 >= m >= 1000: m = 1000
수의 자릿수가 짝수면 그냥 그 자릿수의 최솟값으로 바꿔줬다.
여기까지해서 배열 길이를 10,000,000개로 줄인다고해도 당연히 시간초과가 난다.
(어지간한 문제는 거의 100만 개 내외로 해야하는 듯하다..)
근데 소수가 다 그렇지만 짝수라고는 '2' 밖에 없다.
- 그럼 굳이 에라토스테네스의 체를 구현할 때 '짝수번째 원소를 넣어야하나?' 라는 의문이 생길지도..?
primes = [False] + [True] * (m//2) for i in range(1, len(primes)): if primes[i]: print(2*i+1) for j in range(i + (2*i+1), len(primes), 2*i+1): primes[j] = False
아무튼 이렇게 하면 2를 제외하고는 배열 길이를 절반으로 줄이고 소수를 모두 구할 수 있다.
이제 여기에 팰린드롬 검사만 넣어주자.
코드
def reverse(text):
result = ''
for t in text:
result = t + result
return result
n, m = map(int, input().split())
if m >= 10000000:
m = 10000000
if 1000000 >= m >= 100000:
m = 100000
if 10000 >= m >= 1000:
m = 1000
primes = [False] + [True] * (m//2)
for i in range(1, len(primes)):
if primes[i]:
if i*2 + 1 >= n and str(i*2+1) == reverse(str(i*2+1)):
print(2*i+1)
for j in range(i + (2*i+1), len(primes), 2*i+1):
primes[j] = False
print(-1)
이렇게 풀면 끝 !
Author And Source
이 문제에 관하여([Python 파이썬]백준 1990번 소수인팰린드롬 풀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ashooozzz/Python-파이썬백준-1990번-소수인팰린드롬-풀이저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)