
내가 생각했을때 문제에서 원하는부분
첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1000)이 주어진다.
둘째 줄부터 T줄에 걸쳐 테스트 케이스별로 어떤 십진수의 수 A(1 ≤ A ≤ 100,000,000,000)와 n(2 ≤ n ≤ 16)이 공백을 두고 주어진다.
각 줄마다 테스트 케이스가 회문일 경우 1, 아닐 경우에는 0을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: BufferedReader 객체를 생성하여 입력을 받을 준비를 한다.
StringBuilder sb = new StringBuilder();: 출력할 결과를 저장할 StringBuilder 객체를 생성한다.
int T = Integer.parseInt(br.readLine());: 첫 번째 줄에서 테스트 케이스의 개수 T를 읽고 정수로 변환한다.
테스트 케이스 반복문(for (int i = 0; i < T; i++)): T번 만큼 반복하여 각 테스트 케이스를 처리한다.
StringTokenizer st = new StringTokenizer(br.readLine());: 각 줄마다 A와 n이 공백으로 구분되어 있으므로, StringTokenizer를 사용하여 이들을 분리한다.
long A = Long.parseLong(st.nextToken());: A는 최대 10^11까지 가능하므로 long 타입으로 파싱한다.
st.nextToken()으로 첫 번째 토큰(A에 해당하는 문자열)을 가져온다.
int n = Integer.parseInt(st.nextToken());: n은 2부터 16까지이므로 int 타입으로 파싱한다.
String nBaseStr = Long.toString(A, n);: Java의 내장 메서드 Long.toString(long i, int radix)를 사용하면 십진수 i를 radix(진수)에 해당하는 문자열로 아주 간단하게 변환할 수 있다.
10진수 10 이상인 경우 자동으로 a, b 등으로 표현해 주므로 직접 구현할 필요가 없어 코드를 간결하게 만들 수 있다.
boolean isPalindrome = checkPalindrome(nBaseStr);: 위에서 변환된 n진수 문자열 nBaseStr가 회문인지 확인하기 위해 checkPalindrome라는 보조 메서드를 호출한다.
이 메서드는 회문이면 true, 아니면 false를 반환한다.
if(isPalindrome) { sb.append("1\n"); } else { sb.append("0\n"); }: checkPalindrome의 결과에 따라 1 또는 0을 StringBuilder에 추가한다.
\n을 함께 추가하여 줄바꿈까지 처리한다.
System.out.print(sb.toString());: 모든 테스트 케이스의 결과를 StringBuilder에 모은 후, 마지막에 한 번에 출력한다.
이렇게 하면 입출력 횟수를 줄여서 성능을 향상시킬 수 있다.
br.close();: 사용이 끝난 BufferedReader는 닫아서 자원 누수를 방지한다.
checkPalindrome 메서드:
public static boolean checkPalindrome(String s): 주어진 문자열 s가 회문인지 검사하는 정적 메서드이다.
StringBuilder reversedS = new StringBuilder(s).reverse();: 주어진 문자열 s를 인자로 StringBuilder를 생성한 후, reverse() 메서드를 호출하여 문자열을 뒤집는다.
return s.equals(reversedS.toString());: 뒤집힌 StringBuilder를 toString()으로 다시 문자열로 변환한 후, 원래 문자열 s와 equals() 메서드로 비교한다.
두 문자열이 완전히 같으면 true (회문), 다르면 false를 반환한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 14561번 문제
public class Main1220 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(); // 출력을 효율적으로 관리하기 위해 StringBuilder를 사용할게요.
int T = Integer.parseInt(br.readLine()); // 테스트 케이스의 수 T를 읽어옵니다.
for(int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()); // 각 테스트 케이스의 A와 n을 읽기 위해 StringTokenizer를 사용합니다.
long A = Long.parseLong(st.nextToken()); // 십진수 A (long 타입으로 처리)
int n = Integer.parseInt(st.nextToken()); // 변환할 진수 n
// 1. A를 n진수로 변환합니다.
// Java의 Long.toString(value, radix) 메서드를 사용하면 쉽게 n진수 문자열을 얻을 수 있습니다.
// 이 메서드는 10 이상의 진수 (예: 16진수)에서도 자동으로 A, B, C... 등으로 표현해줍니다.
String nBaseStr = Long.toString(A, n);
// 2. n진수 문자열이 회문인지 판별합니다.
boolean isPalindrome = checkPalindrome(nBaseStr);
// 결과(1 또는 0)를 StringBuilder에 추가합니다.
if(isPalindrome) {
sb.append("1\n");
} else {
sb.append("0\n");
}
}
System.out.print(sb.toString()); // 모든 결과를 한 번에 출력합니다.
br.close(); // BufferedReader를 닫아 자원을 해제합니다.
}
// 회문 여부를 확인하는 보조 메서드입니다.
public static boolean checkPalindrome(String s) {
// 문자열을 뒤집어서 원래 문자열과 비교하는 방식입니다.
StringBuilder reversedS = new StringBuilder(s).reverse();
return s.equals(reversedS.toString());
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.