문제에서 요구하는 조건사항을 잘 읽고 그대로 구현하면 된다.
0, 2, 5, 8
은 뒤집어도 그대로 0, 2, 5, 8
이다.1
은 뒤집어도 그대로 1
이다.6, 9
는 뒤집으면 각각 9, 6
이 된다.3, 4, 7
은 뒤집으면 더 이상 숫자가 아니다.입력 범위를 생각하면 long
타입으로 접근하자.
// BOJ 10859번: 뒤집어진 소수
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
long n = Long.parseLong(String.valueOf(input));
if (isPrime(n)) {
System.out.println("no");
} else {
if (!check(input)) System.out.println("no");
else {
long after = change(input);
if (isPrime(after)) System.out.println("no");
else System.out.println("yes");
}
}
}
public static boolean isPrime(long num) {
if (num == 1) return true;
for (long i = 2; i * i <= num; i++) {
if (num % i == 0) return true;
}
return false;
}
/**
* 정규 표현식 풀이로 제출하면 42%에서 오답 처리 됨.
* 이 경우에 대한 반례 찾아봐야 함.
*/
public static boolean check(String s) {
// String pattern = "[347]+";
// return !s.matches(pattern);
long num = Long.parseLong(s);
while (num > 0) {
if (num % 10 == 3 || num % 10 == 4 || num % 10 == 7) return false;
num /= 10;
}
return true;
}
public static long change(String s) {
long num = Long.parseLong(s);
long result = 0;
while (num > 0) {
if (num % 10 == 6) result = result * 10 + 9;
else if (num % 10 == 9) result = result * 10 + 6;
else
result = result * 10 + num % 10;
num /= 10;
}
return result;
}
}
소수 판정, 숫자인지 판정, 180도 돌리기를 각각 isPrime()
, check()
, change()
함수로 구현해서 풀이 하였다.
처음엔 check()
에서 정규표현식으로 풀이하였는데 42% 정도에서 오답으로 판정되는 결과가 나왔다.
자릿수 조작에 관한 간단한 수학식으로 풀이하도록 하자.
// 정규표현식 풀이에 대한 반례가 있다면 꼭 댓글 달아주세요...! 감사합니다:)