백준 11068 회문인 수 (JAVA 자바 풀이)


💡 코드 구현
public class Main {
	private static final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args) throws IOException {
		int testCases = Integer.parseInt(bufferedReader.readLine());
		while (testCases-- > 0) {
			boolean palindromic = false;
			int number = Integer.parseInt(bufferedReader.readLine());
			for (int base = 2; base <= 64; base++) {
				if (isPalindromicNumber(convertToBaseSystem(number, base))) {
					System.out.println("1");
					palindromic = true;
					break;
				}
			}
			if (!palindromic) {
				System.out.println("0");
			}
		}
	}
	private static String convertToBaseSystem(int number, int base) {
		StringBuilder answer = new StringBuilder();
		while (number > 0) {
			int remainder = number % base;
			if (remainder < 10) {
				answer.append(remainder);
			} else {
				answer.append((char)('A' + remainder - 10));
			}
			number /= base;
		}
		return answer.toString();
	}
	private static boolean isPalindromicNumber(int number) {
		return isPalindromicNumber(String.valueOf(number));
	}
	private static boolean isPalindromicNumber(String number) {
		return new StringBuilder(number).toString().equals(new StringBuilder(number).reverse().toString());
	}
}
이 문제는 두 가지 로직을 구현할 수 있으면 쉽게 풀리는 문제이다.
1) 진법 변환 하기
2) 회문 여부 판별하기
회문 여부를 판별하는 것은 stringbuilder를 사용하면 이와 같이 어렵지 않게 구할 수 있다.
private static boolean isPalindromicNumber(int number) {
   return isPalindromicNumber(String.valueOf(number));
}
private static boolean isPalindromicNumber(String number) {
   return new StringBuilder(number).toString().equals(new StringBuilder(number).reverse().toString());
}
진법 변환은 직접 구현을 해주었고 다음과 같은 코드로 작성하였다.
	private static String convertToBaseSystem(int number, int base) {
		StringBuilder answer = new StringBuilder();
		while (number > 0) {
			int remainder = number % base;
			if (remainder < 10) {
				answer.append(remainder);
			} else {
				answer.append((char)('A' + remainder - 10));
			}
			number /= base;
		}
		return answer.toString();
	}
시간 복잡도를 분석해보면 다음과 같다.
i) convertToBaseSystem() - 주어진 숫자를 base 진법으로 변환하는 작업을 수행한다. 주어진 숫자의 자릿수에 비례하여 연산이 수행되므로, 주어진 숫자의 자릿수를 d라고 할 때, 시간 복잡도는 O(d)이다.
ii) isPalindromicNumber() - 주어진 숫자가 회문인지 확인하는 작업을 수행한다. 주어진 숫자의 자릿수에 비례하여 연산이 수행되므로, 주어진 숫자의 자릿수를 d라고 할 때, 시간 복잡도는 O(d)이다.
문제에서 테스트 데이터의 최대 값을 1,000,000으로 설정하고 있으므로 최저 자리수인 2진법을 고려해도 자릿수는 상수 시간으로 판단된다. 
따라서, 주요한 반복문의 반복 횟수는 입력된 테스트 케이스 수에 비례하며, 즉 O(testCases)가 된다.
T의 범위는 문제에서 주어지지 않고 있으며, 이런 경우 일반적으로 시간 복잡도가 큰 영향을 미치지 않는 문제라고 해석할 수 있겠다.
반응형
    
    
    
  '알고리즘 > 백준' 카테고리의 다른 글
| 백준 2840 행운의 바퀴 (JAVA 자바 풀이) (0) | 2023.06.24 | 
|---|---|
| 백준 1730 판화 (JAVA 자바 풀이) (0) | 2023.06.09 | 
| 백준 11005 진법 변환 2 (JAVA 자바 풀이) (0) | 2023.06.09 | 
| 백준 10448 소인수 분해 (JAVA 자바 풀이) (0) | 2023.06.08 | 
| [백준/자바] 3273 두수의 합 (0) | 2023.06.08 |