백준

백준 1747번 소수&팰린드롬(java)

대기업 가고 싶은 공돌이 2024. 8. 2. 18:36

[Silver I] 소수&팰린드롬 - 1747

문제 링크

성능 요약

메모리: 70660 KB, 시간: 260 ms

분류

브루트포스 알고리즘, 수학, 정수론, 소수 판정, 에라토스테네스의 체

제출 일자

2024년 8월 2일 18:17:58

문제 설명

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

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

입력

첫째 줄에 N이 주어진다.

출력

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

풀이

소수와 팰린드롬을 동시에 만족하는 숫자를 찾는 문제다.

 

소수는 1과 자기 자신을 제외한 수 중 약수가 존재하면 안 되고,

팰린드롬은 뒤집어도 똑같은 수를 의미한다.

 

소수를 에라토스테네스의 체를 사용해서 풀어야 한다고 하지만,

(에라토스테네스의 체란 소수를 판별할 때 제곱근까지만 검사하면 된다는 수학적 용어이다.)

 

에라토스테네스의 체를 사용하지 않아도 시간제한에 걸리지 않고 통과할 수 있긴 하다.

 

if (팰린드롬) 일 때만 소수인지를 검사하면, 에라토스테네스의 체를 사용하지 않아도 시간제한에 걸리지 않고 문제를 풀 수 있다.

 

에라토스테네스의 체를 사용하지 않는다고 했을 때 팰린드롬을 검사하는 시간이 소수를 검사하는 시간보다 훨씬 빠르기 때문에 바깥 if 문에 팰린드롬 검사를 먼저 넣어주면 시간제한에 걸리지 않고 통과할 수 있다.

 

전체 코드

public class Main{
    static int N, max = 0, selec[];
    static char[] x;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());
        int  i = N;
        if(N == 1){
            bw.write("2");
            bw.flush();
            return;
        }
        while(true){

            String a= String.valueOf(i);

            x = a.toCharArray();

            if(pael()){
                if(sosu(i)) {
                    bw.write(a);
                    bw.flush();
                    break;
                }
            }

            i++;

        }

    }

    static public boolean sosu(int k){
        for(int i = 2 ;i<=Math.sqrt(k)+1;i++){
            if(k % i == 0){
                return false;
            }
        }
        return  true;
    }

    static public boolean pael(){
        for(int  i = 0 ; i<x.length/2;i++) {
            if (x[i] != x[x.length-1-i]) {
                return false;
            }
        }


        return true;
    }

}