이번에 풀어본 문제는
백준 17609번 회문 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder answer = new StringBuilder();
while (T-- > 0) {
String input = br.readLine();
StringBuilder sb = new StringBuilder(input);
String result = "2";
// 회문
if (input.equals(sb.reverse().toString())) {
result = "0";
}
// 유사회문
else {
int left = 0;
int right = input.length() - 1;
while (left < right) {
if (input.charAt(left) != input.charAt(right)) {
// 왼쪽, 오른쪽 각각 지워봄
StringBuilder delLeft = new StringBuilder(input).deleteCharAt(left);
StringBuilder delRight = new StringBuilder(input).deleteCharAt(right);
// 둘중 하나라도 성사되면 유사회문
if (delLeft.toString().equals(delLeft.reverse().toString()) || delRight.toString().equals(delRight.reverse().toString())) {
result = "1";
}
break;
}
left++;
right--;
}
}
answer.append(result).append("\n");
}
answer.deleteCharAt(answer.length() - 1);
System.out.print(answer);
}
}
주어진 조건에 맞는 문자열에 대해 회문은 "0", 유사회문은 "1", 나머지는 "2"를 출력하는 문제입니다.
StringBuilder의 reverse 함수를 사용하여 뒤집었을 때, 두 문자열이 일치한다면 회문으로 판단할 수 있습니다.
유사회문의 경우, 양 끝부터 문자를 하나하나 비교하여 서로 달라지는 시점에서 둘 중 하나를 제거해서 일치시킬 수 있다면, 유사 회문입니다.
이외에는 "2"를 출력해주면, 해결할 수 있습니다.