728x90
1. 문제 설명
151은 소수이면서 동시에 팰린드롬이기 때문에 소수인 팰린드롬이다. 팰린드롬이란 앞으로 읽어나 뒤로 읽으나 같은 수를 말한다. 예를 들어 1234는 앞으로 읽으면 1234지만, 뒤로 읽으면 4321이 되고 이 두 수가 다르기 때문에 팰린드롬이 아니다. 두 정수 a, b가 주어졌을 때, a이상 b이하인 소수인 팰린드롬을 모두 구하는 프로그램을 작성하시오.
- 입력
- 입력은 첫째 줄에 공백으로 구분된 두 자연수 a, b가 주어진다. 단 5 ≤ a < b ≤ 100,000,000 이다.
- 출력
- 첫째 줄부터 차례로 증가하는 순서대로 한 줄에 한개씩 소수인 팰린드롬을 출력한다. 마지막 줄에는 -1을 출력한다.
2. 코드
import sys
input = sys.stdin.readline
# 입력
a, b = map(int, input().split())
# 천만 이상의 소수 이면서 팰린드롬 수는 존재 하지 않는다!!
if b > 10 ** 7:
b = 10 ** 7
# 에라토스테네스의 체 준비
prime = [False, False] + [True] * (b - 1)
# 에라토스테네스의 체를 하는 동시에 팰린드롬을 확인한다.
for i in range(2, b - 1):
# 소수 인지 판별
if prime[i]:
# 소수라면 팰린드롬을 확인하기 위해 str형 변환
k = str(i)
# 만약 팰린드롬이면서 a보다 크거나 같아서 a, b 범위 안에 있는지 확인.
if k == k[::-1] and i >= a:
# 프린트
print(i)
# 나머지 에라토스테네스의 체 실행
for j in range(2 * i, b + 1, i):
prime[j] = False
# 마지막에 -1 출력
print(-1)
3. 회고
Q. 문제를 보고 든 생각
- 천만 이상의 소수이면서 팰린드롬은 존재 하지 않는다.
- 이 문제의 핵심이다.
- 이 사실을 모르고 문제에서 주어진대로 풀이 하게 된다면 시간초과 나 메모리 초과를 맞을 것이다.
- 필자도 그랬듯... 그렇다보니 이상하다는 생각을 하게 되었고 문제와 상관없이 천만이상 부터 1억 까지
- 소수 이면서 팰린드롬은 프린트 되지 않는 사실을 보고.. 풀이가 간단해졌다.
- 순서의 문제
- 팰린드롬을 구한 후 소수 인지 판별한다.
- 해당 방식은 시간적인 효율성은 떨어지지만 통과는 가능한 코드이다.
- 하지만 아래의 방법으로 풀이를 하는것이 효율적이라는 생각이 든다.
- 소수를 먼저 파악한후 팰린드롬인지 판별한다.
- 소수를 먼저 구한후 팰린드롬은 구하게 된다면 5부터 1억 사이에 있는 팰린드롬의 수 하고 소수의 수의 차이가 많이 나기 때문에 이 방식이 더 효율적이라고 생각이된다.
- 팰린드롬을 구한 후 소수 인지 판별한다.
4. 고쳐야 할점
문제의 핵심을 파악하는 연습과 숫자의 범위를 보고 이상함을 빠르게 느끼는 연습이 필요한 것같다.
728x90
'Algorithm > Python' 카테고리의 다른 글
백준 14500번 테트로미노 (0) | 2023.01.21 |
---|---|
백준 2636번 치즈 (0) | 2023.01.18 |
백준 1913번 달팽이 (0) | 2023.01.12 |
백준 17135번 캐슬 디펜스 (1) | 2023.01.09 |
백준 9613번 GCD 합 (0) | 2023.01.08 |