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;
	}
}