본문 바로가기
코딩 테스트

[백준] 11068번 : 회문인 수 - JAVA[자바]

by Mong-_- 2023. 10. 12.

https://www.acmicpc.net/problem/11068

 

11068번: 회문인 수

어떤 수를 왼쪽부터 읽어도, 오른쪽부터 읽어도 같을 때 이 수를 회문인 수라고 한다. 예를 들어, 747은 회문인 수이다. 255도 회문인 수인데, 16진수로 표현하면 FF이기 때문이다. 양의 정수를 입력

www.acmicpc.net

 


■문제

 


문제 이해

이해하기 어려운 문제는 아니다.

입력받은 수 n을 2 ~ 64의 진법으로 변환했을 때 회문(펠린드롬)인 경우가 있는 지 판별하는 문제이다.

 

바로 풀어보쟈잇

 


 풀이

255를 16진수로 변환했을 때 FF가 나온다.

이처럼 10진수가 넘는 진법은 문자로 저장되어야 하는데 예를 들어 64진법으로 변환할 땐 어떻게 처리해야 하지?

라는 고민을 하였다.

 

이는 생각보다 간단한 방법으로 해결할 수 있었다.

 

255를 16진수로 변환하면 => F F가 나온다. 이때, F를 그냥 15로 저장하는 것이다.

즉, 문자로 변환하지 않고 배열에 10진수 그대로 저장하는 것이다. 

 

10진수로 변환된 배열의 시작점과 끝점을 비교하며 회문인지 판별하면 된다. (투 포인터 사용)

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            int num = Integer.parseInt(br.readLine());
            boolean isPalindrome = false;

            for (int radix = 2; radix <= 64; radix++) {
                if (checkPalindrome(num, radix)) {
                    isPalindrome = true;
                    break;
                }
            }

            sb.append(isPalindrome ? "1" : "0").append("\n");
        }

        System.out.println(sb);
    }

    private static boolean checkPalindrome(int num, int radix) {
        ArrayList<Integer> numList = new ArrayList<>();

        while (num > 0) {
            numList.add(num % radix);
            num /= radix;
        }

        int start = 0;
        int end = numList.size() - 1;

        while (start <= end) {
            if (numList.get(start) != numList.get(end)) {
                return false;
            }

            start++;
            end--;
        }

        return true;
    }
}