반응형
[백준 Baekjoon] 1990번 소수인팰린드롬 - JAVA
문제 풀이
문제에서 주어진 a와 b의 범위가 최대 100,000,000 - 5로 매우 큽니다. 이렇게 큰 범위에서 소수인지 판별할 때는 에라토스테네스의 체를 사용하는 것이 효율적입니다. 다음과 같이 에라토스테네스의 체를 사용하여 소수인지 저장합니다.
public static boolean[] isPrime = new boolean[100_000_001];
public static void eratosthenes() {
isPrime[0] = isPrime[1] = true;
for (int i = 2; i * i <= 100_000_000; i++) {
if (!isPrime[i]) {
for (int j = i * i; j <= 100_000_000; j += i) {
isPrime[j] = true;
}
}
}
}
자바에서 boolean 배열은 처음 생성 시 false로 초기화 되어 true인 경우 소수가 아닌것으로 사용합니다.
다음으로는 팰린드롬인지 검사를 해야 합니다.
public static boolean isPalindrome(int n) {
String t = String.valueOf(n);
for (int i = 0; i < t.length() / 2; i++) {
if (t.charAt(i) != t.charAt(t.length() - i - 1)) {
return false;
}
}
return true;
}
숫자를 문자열로 바꿔 양 끝의 수를 중앙까지 비교하여 다른 경우 false를 리턴합니다. 비교가 완료될때까지 다른 경우가 없다면 true를 리턴합니다.
효율적으로 검사하기 위해 a 이상 b 이하의 수를 소수인지 먼저 검사한 다음 팰린드롬인지 검사합니다.
for (int i = a; i <= b; i++) {
if (!isPrime[i] && isPalindrome(i)) {
sb.append(i).append("\n");
}
}
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static boolean[] isPrime = new boolean[100_000_001];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
eratosthenes();
StringBuilder sb = new StringBuilder();
for (int i = a; i <= b; i++) {
if (!isPrime[i] && isPalindrome(i)) {
sb.append(i).append("\n");
}
}
sb.append(-1);
System.out.println(sb);
}
public static boolean isPalindrome(int n) {
String t = String.valueOf(n);
for (int i = 0; i < t.length() / 2; i++) {
if (t.charAt(i) != t.charAt(t.length() - i - 1)) {
return false;
}
}
return true;
}
public static void eratosthenes() {
isPrime[0] = isPrime[1] = true;
for (int i = 2; i * i <= 100_000_000; i++) {
if (!isPrime[i]) {
for (int j = i * i; j <= 100_000_000; j += i) {
isPrime[j] = true;
}
}
}
}
}
반응형
'알고리즘(Algorithm) > 백준(Baekjoon)' 카테고리의 다른 글
[백준 Baekjoon] 1153번 네 개의 소수 - JAVA (0) | 2022.01.25 |
---|---|
[백준 Baekjoon] 1713번 후보 추천하기 - JAVA (0) | 2022.01.13 |
[백준 Baekjoon] 2251번 물통 - JAVA (0) | 2022.01.05 |
[백준 Baekjoon] 15486번 퇴사 2 - JAVA (0) | 2022.01.05 |
[백준 Baekjoon] 11441번 합 구하기 - JAVA (0) | 2022.01.04 |