코딩테스트/백준

[백준 1747] 소수&팰린드롬 (Java) - 에라토스테네스의 체, 소수

imachill7guy 2025. 3. 10. 19:17

https://www.acmicpc.net/problem/1747

 

소수&팰린드롬

문제

어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다.

어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고, 소수이면서 팰린드롬인 수 중에서, 가장 작은 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다.

출력

첫째 줄에 조건을 만족하는 수를 출력한다.

예제 입력 1 복사

31

예제 출력 1 복사

101

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main (String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // N보다 같거나 크면서 소수 & 팰린드롬

        // 소수 찾기 : 에라토스테네스의 체 이용
        int[] A = new int[10000001];

        // 각 index에 값 채우기
        for(int i=2; i<A.length; i++){
            A[i] = i;
        }

        // 최대값의 제곱근까지 소수찾기 (1은 소수아님)
        for(int i=2; i<Math.sqrt(A.length); i++){
            if(A[i] == 0) continue; // 소수가 아니면 건너 뜀
            for(int j=i+i; j<A.length; j+=i){ // 배수 지우기
                A[j] = 0;
            }
        }

        for(int i=N; i<A.length; i++){
            if(A[i] == 0) continue;

            // 소수라면 팰린드롬인지 검사
            if(isPalindrome(i)){
                System.out.println(A[i]);
                break;
            }
        }
    }

    private static boolean isPalindrome(int target) {
        // 소수라면 팰린드롬 검사 시작
        char[] P = String.valueOf(target).toCharArray();

        // start, end index
        int start = 0;
        int end = P.length - 1;

        while (start < end){
            // start, end가 가리키는 곳이 문자가 다르다면 false
            if (P[start] != P[end]) return false;

            // 같다면 point 이동
            start ++;
            end --;
        }
        // while문 다 돌 때까지 return 되지 않았다면 true
        return true;
    }


}

 

  • 에라토스테네스의 체를 이용하여 입력값 최댓값까지의 소수를 찾아낸다.
  • N이상의 소수&팰린드롬을 찾아야 하므로 N번째 부터 A를 순회하며 팰린드롬을 찾는다.
  • 팰린드롬을 찾으면 N이상 값중 최솟값이므로 출력하고 break한다.
  • 팰린드롬 찾는 로직
    • 입력받은 target(숫자)를 char[]로 변환한다.
    • 투포인터를 활용하여 배열P를 맨앞글자, 맨 뒷글자부터 탐색한다.
    • 만약 start, end가 가리키는 문자가 같지않으면 false 
    • start, end가 가리키는 문자가 같다면 다음 포인터로 이동 start++, end--