메모리: 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;
}
}
'백준' 카테고리의 다른 글
백준 11558번 The Game of Death(java) (0) | 2024.08.03 |
---|---|
백준 2331번 반복수열(java) (0) | 2024.08.03 |
백준 2531번 회전 초밥(java) (0) | 2024.08.02 |
백준 2343번 기타 레슨(java) - 이분 탐색 방식 (0) | 2024.08.01 |
백준 2343번 기타 레슨(java) (0) | 2024.08.01 |