<BOJ>10859번: 뒤집어진 소수

라모스·2022년 1월 2일
0

BOJ

목록 보기
11/22
post-thumbnail
post-custom-banner

문제


10859번: 뒤집어진 소수

접근

문제에서 요구하는 조건사항을 잘 읽고 그대로 구현하면 된다.

  • 초기 숫자가 소수인지, 180도로 회전했을 때 숫자인지, 숫자라면 소수인지 까지도 판별해야 한다.
  • 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% 정도에서 오답으로 판정되는 결과가 나왔다.
자릿수 조작에 관한 간단한 수학식으로 풀이하도록 하자.

// 정규표현식 풀이에 대한 반례가 있다면 꼭 댓글 달아주세요...! 감사합니다:)

profile
Step by step goes a long way.
post-custom-banner

0개의 댓글