본문 바로가기
Algorithm/Python

백준 1990번 소수인팰린드롬

by Shark_상어 2023. 1. 15.
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