본문 바로가기
자바 알고리즘/백준

11068 : 회문인 수

by hoshi03 2024. 12. 15.

문제

어떤 수를 왼쪽부터 읽어도, 오른쪽부터 읽어도 같을 때 이 수를 회문인 수라고 한다. 예를 들어, 747은 회문인 수이다. 255도 회문인 수인데, 16진수로 표현하면 FF이기 때문이다. 양의 정수를 입력받았을 때, 이 수가 어떤 B진법 (2 ≤ B ≤ 64)으로 표현하면 회문이 되는 경우가 있는지 알려주는 프로그램을 작성하시오. B진법이란, 한 자리에서 수를 표현할 때 쓸 수 있는 수의 가짓수가 B라는 뜻이다. 예를 들어, 십진법에서 B는 10이다. 

입력

입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 64 이상 1,000,000 이하인 하나의 정수로 주어진다.

출력

출력은 표준출력을 사용한다. 하나의 테스트 데이터에 대한 답을 하나의 줄에 출력한다. 각 테스트 데이터에 대해, 주어진 수가 어떤 B진법 (2 ≤ B ≤ 64)으로 표현하여 회문이 될 수 있다면 1을, 그렇지 않다면 0을 출력한다.

예제 입력 1 복사

3
747
255
946734

예제 출력 1 복사

1
1
0

 

• 풀이

 

입력받은 수를 진법변환해서 뒤집어도 같으면 되는 문제

 

2~64로 진법변환해서 가능한 경우 하나라도 있으면 회문이다

 

1~9까지는 그냥 숫자로 변환해도 문제가 없었지만

10 부터는 진법으로 표현한 결과가101110 일때 뒤집으면 011101이 되서 숫자로는 판별이 안됬다

11~64 진법은 문자로 표현하는 방식으로 회문을 구해서 문제를 풀었다

 

import java.util.*;
import java.io.*;

class Main {
    public static int pal(int tmp){
        int res = 0;
        for(int i = 2; i <= tmp && i <= 64; i++){
            StringBuilder sb = new StringBuilder();
            int cur = tmp;
            while (cur != 0){
                int append = cur % i;
                // 10 넘어가면 뒤집을때 문자로 변환해줘야됨
                if (i >= 10){
                    append += 65;
                    while (append-i >= 65 && append-i <= 97) append -= i;
                    sb.append((char)append);
                }
                else sb.append(cur % i);
                cur /= i;
            }
            String s1 = sb.toString();
            String s2 = sb.reverse().toString();
            if (s1.equals(s2)){
                res = 1;
                break;
            }
        }
        return res;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        while(n --> 0){
            int tmp = Integer.parseInt(br.readLine());
            if (String.valueOf(tmp).equals(sb.append(String.valueOf(tmp)).reverse().toString())) System.out.println(1);
            else System.out.println(pal(tmp));
        }
    }
}

'자바 알고리즘 > 백준' 카테고리의 다른 글

백준 1730 : 판화 (구현)  (3) 2024.12.16
백준 3085 사탕게임  (0) 2024.12.15
백준 2108 : 통계학(구현?)  (0) 2024.11.19
백준 18110 ( 구현, 정렬, 소수점 처리)  (0) 2024.11.18
백준 15654 : n과 m (재귀)  (0) 2024.06.22