Java
[백준 17609] 회문 (JAVA)
iheeeee6-6
2023. 6. 21. 14:12
728x90
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
check메소드에서 while문으로 left와 right 를 하나씩 비교하면서 회문임을 확인한다.
check2 메소드에서는 while문으로 left와 right 를 하나씩 비교하고,
같지 않다면 check(left+1,right) 와 check(left,right-1) 로 왼쪽 하나와 오른쪽 하나를 지웠을때 회문인지 확인한다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static char[] arr;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
for (int i = 0; i < num; i++) {
arr = br.readLine().toCharArray();
int left = 0;
int right = arr.length - 1;
if (check(left, right)) { //회문인지 확인하기
System.out.println(0);
continue;
}
if (check2(left, right)) { //왼쪽 하나 혹은 오른쪽 하나를 지웠을때 회문인지 확인하기
System.out.println(1);
} else {
System.out.println(2);
}
}
}
static boolean check(int left, int right) {
while (left <= right) {
if (arr[left] != arr[right]) {
return false;
}
left += 1;
right -= 1;
}
return true;
}
private static boolean check2(int left, int right) {
while (left <= right) {
if (arr[left] != arr[right]) {
boolean c1 = check(left + 1, right); //왼쪽 하나 지우기
boolean c2 = check(left, right - 1); //오른쪽 하나 지우기
if (c1 || c2) { //둘 중 하나라도 회문이면 1 반환하도록
return true;
} else
return false;
}
left += 1;
right -= 1;
}
return true;
}
}