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--
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 1850] 최대공약수 (Java) - 유클리드 호제법, 최대공약수 (0) | 2025.03.10 |
---|---|
[백준 1934]최소 공배수 구하기(Java) 유클리드 호제법 (0) | 2025.03.10 |
[백준 1456] 거의 소수 (Java) - 에라토스테네스의 체 (0) | 2025.03.08 |
[백준 1929] 소수 구하기 (Java) (0) | 2025.03.07 |
[백준 1541] 잃어버린 괄호 (Java) (0) | 2025.03.07 |