백준 17609번, 회문

95qwer·2022년 6월 16일
0


왼쪽 idx / 오른쪽 idx를 설정

첫 번째 while문 (조건 left < right)
1. 둘이 같으면 왼쪽은 ++ / 오른쪽은 --를 하여 중앙으로 진행
2. 둘이 다르다면, right--로 오른쪽 idx만 이동 후 count++.
3. count >= 2라면, 즉 회문이 아니라면 while문을 빠져나옵니다.

즉, 첫 번째 while문의 탈출 조건은 left >= right / count >= 2입니다.

두 번째 while문 (조건 left < right)
0. count != 0인 문자열에 대해서만 진행합니다. 즉, 확실히 회문은 아니지만 왼쪽에서 부분 회문 조건이 있는지 오른쪽에서 부문 회문 조건이 있는지 모를 문자열에 대해서 다시 한 번 검사합니다.

  1. 둘이 같으면 왼쪽은 ++ / 오른쪽은 --를 하여 중앙으로 진행
  2. 둘이 다르다면, left++로 왼쪽 idx만 이동 후 count2++.
  3. count2 >= 2라면, 즉 회문이 아니라면 while문을 빠져나옵니다.

첫 번째 while문을 통해 확실한 회문만이 걸러집니다.
두 번째 while문을 통해 부분 회문 / 아무것도 아닌 문자열이 걸러집니다.

두 번째 while문을 통해 나온 count2와 첫 번째 while문을 통해 나온 count 중,
둘 중 하나라도 부분회문에 해당하는 1값이 있다면, 그 문자열은 부분회문입니다.
왼쪽에 부분회문 조건값이 존재했다면, 예를 들어 xabba일 경우, 첫 번째 while문을 통해서는
2가 나오지만 두 번째 while문에서는 1이 나옵니다.

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(bfr.readLine());
		for (int i = 0; i < n; i++) {
			String tmp = bfr.readLine();
			int left = 0;
			int right = tmp.length() - 1;
			int count = 0;
			int count2 = 0;
			while (left < right) {
				if (tmp.charAt(left) == tmp.charAt(right)) {
					left++;
					right--;
				} else {
					right--;
					count++;
				}
				if(count >= 2)
					break;
			}
			if (count != 0) {
				left = 0;
				right = tmp.length() - 1;
				while (left < right) {
					if (tmp.charAt(left) == tmp.charAt(right)) {
						left++;
						right--;
					} else {
						left++;
						count2++;
					}
					
					if(count2 >= 2)
						break;
				}
			}
			if (count == 0)
				System.out.println(0);
			else if (count == 1 || count2 == 1)
				System.out.println(1);
			else
				System.out.println(2);
		}
		bfr.close();
	}
}

profile
한땀한땀오타없이

0개의 댓글