[Python][백준 1747] 소수&팰린드롬

Date:     Updated:

카테고리:

태그:

🔄 소수&팰린드롬 문제 풀이

백준 1747번 소수&팰린드롬 문제의 파이썬 풀이

📝 문제 설명

어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79197과 324423 등이 팰린드롬 수이다. 입력으로 주어진 수보다 크거나 같고, 소수이면서 팰린드롬인 수 중에서 가장 작은 수를 구하는 프로그램을 작성하시오.

💡 풀이

이 문제는 두 가지 조건을 모두 만족하는 수를 찾아야 한다.

  1. 소수여야 함
  2. 팰린드롬이어야 함

에라토스테네스의 체로 일부 소수를 미리 구해놓고, 입력값부터 시작하여 각 수가 팰린드롬인지 확인한 뒤 소수를 찾는다.

🔍 코드 설명

  1. 팰린드롬 판별 함수 구현:
    • 문자열로 변환하여 뒤집은 것과 비교
  2. 에라토스테네스의 체로 소수 생성:
    • 특정 범위까지의 소수를 미리 계산
  3. 주어진 수부터 시작하여:
    • 팰린드롬인지 확인
    • 소수인지 확인
    • 두 조건을 모두 만족하면 그 수를 반환

✨ 참고

  • 에라토스테네스의 체로 일부 소수를 미리 구해두면 효율적이다.

🎯 주의사항

  • 입력값이 1인 경우를 고려해야 한다.
  • 결과값이 항상 존재한다.

📝 코드

import sys

def is_palindrome(num):
    """주어진 숫자가 팰린드롬인지 확인하는 함수"""
    return str(num) == str(num)[::-1]

def generate_primes(limit):
    """에라토스테네스의 체를 사용하여 limit 이하의 모든 소수를 구하는 함수"""
    is_prime = [True] * (limit + 1)
    is_prime[0] = is_prime[1] = False  # 0과 1은 소수가 아님

    for num in range(2, limit + 1):
        if is_prime[num]:  # 소수이면 그 배수를 제거
            for multiple in range(num * num, limit + 1, num):
                is_prime[multiple] = False

    return [num for num, prime in enumerate(is_prime) if prime]

def find_smallest_prime_palindrome(n):
    """n 이상인 가장 작은 소수이면서 팰린드롬인 숫자를 찾는 함수"""
    prime_list = generate_primes(1004)  # 1004 이하의 소수 미리 계산

    # n부터 시작하여 가장 작은 소수 & 팰린드롬 찾기
    num = n
    while True:
        if num == 1:  # 1은 소수가 아님
            num += 1
            continue
        if is_palindrome(num):
            # 미리 계산한 소수 리스트에서 찾거나, 직접 판별
            if num in prime_list or all(num % p != 0 for p in prime_list if p * p <= num):
                return num
        num += 1

# 입력 받기
n = int(sys.stdin.readline().strip())

# 결과 출력
sys.stdout.write(str(find_smallest_prime_palindrome(n)) + "\n")

Python Coding Test 카테고리 내 다른 글 보러가기