어떤 수를 왼쪽에서 읽어도, 오른쪽에서 읽어도 같다면
이를 회문 수라고 한다.
예를 들어
747
은 회문 수이다.
또한 어떤 수는 다른 진법으로 표현했을 때 회문이 될 수도 있다.
예
255 (10진수) → FF (16진수)
이 경우도 회문이다.
주어진 정수 N이
2 ≤ B ≤ 64
범위의 어떤 진법으로 표현했을 때
회문이 되는 경우가 있는지 판단한다.
첫째 줄
T
테스트 케이스 개수
각 줄마다 하나의 정수 N
조건
64 ≤ N ≤ 1,000,000
각 테스트 케이스마다
103
747
255
946734
1
1
0
이 문제의 핵심은 두 가지이다.
1. 여러 진법으로 변환
2. 회문인지 검사
1, 아니면 0각 진법마다 직접 변환하고,
배열을 이용해 회문 여부를 검사했다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int[] result = new int[T];
for (int i = 0; i < T; i++) {
int N = sc.nextInt();
for (int base = 2; base <= 64; base++) {
int[] digit = new int[20];
int num = N;
int k = 0;
while (num > 0) {
digit[k] = num % base;
num /= base;
k++;
}
int isPalindrome = 1;
for (int l = 0; l < k / 2; l++) {
if (digit[l] != digit[k - l - 1]) {
isPalindrome = 0;
break;
}
}
if (isPalindrome == 1) {
result[i] = 1;
break;
}
}
}
for (int i = 0; i < T; i++) {
System.out.println(result[i]);
}
}
}
강의에서는 회문 검사 부분을 함수로 분리하여
코드를 더 깔끔하게 구성했다.
import java.util.Scanner;
class Main
{
public static boolean isPalindromeInBase(int x, int base) {
int[] digit = new int[20];
int len = 0;
while (x > 0) {
digit[len++] = x % base;
x /= base;
}
for (int i = 0; i < len / 2; i++)
if (digit[i] != digit[len - i - 1])
return false;
return true;
}
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T-- > 0) {
int x = sc.nextInt();
boolean ans = false;
for (int i = 2; i <= 64; i++) {
if (isPalindromeInBase(x, i)) {
ans = true;
break;
}
}
System.out.println(ans ? 1 : 0);
}
}
}
| 방식 | 특징 |
|---|---|
| 내 풀이 | 모든 로직을 main에서 처리 |
| 강의 풀이 | 회문 검사 함수 분리 |
강의 코드는
함수 분리 → 가독성 향상
이 장점이 있다.
digit = N % base
N = N / base
이 과정을 반복하면 해당 진법의 숫자를 구할 수 있다.
배열이
앞에서 읽은 값 = 뒤에서 읽은 값
이면 회문이다.
예
1 2 3 2 1
진법 변환 과정에서
낮은 자리부터 저장
되므로
digit[0] = 가장 뒤 숫자
형태가 된다.
하지만 회문 검사는 그대로 가능하다.
각 테스트 케이스마다
따라서 전체 시간 복잡도는
O(T × 64 × log N)
으로 충분히 빠르다.
이 문제는 단순히 회문을 검사하는 것이 아니라
여러 진법으로 변환 후 회문 여부를 확인하는 문제였다.
핵심은 다음과 같다.
강의 코드처럼 회문 검사 로직을 함수로 분리하면
코드를 더 깔끔하게 작성할 수 있다는 점도 배울 수 있었다.