코테 공부

회문 (백준 17609번, 자바)☆☆

DaEun_ 2023. 3. 3. 10:21

 

https://www.acmicpc.net/problem/17609

 

17609번: 회문

각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.

www.acmicpc.net

 

 

1. 비교 중에 문자가 다른 경우

두가지의 경우를 고려 --> 왼쪽 포인터를 이동한 경우와 오른쪽 포인터를 이동한 경우  -> 유사회문인지 판단

 

2. 홀수여도 회문 가능 

 

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

public class Main_17609_회문 {

	static String s;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T =Integer.parseInt(br.readLine());

		
		for(int i=1;i<=T;i++) {
			s=br.readLine();
			int answer=0;
			int start=0;
			int end=s.length()-1;
			
			for(int j=0;j<s.length()/2;j++) {
				if(!compare(start+j, end-j)) { //문자 값이 다르다면
					if(compare(start+1+j, end-j)) { //유사회문이면 
						if(palindrome(start+1+j, end-j)) {
							answer=1; 
							break;
						}
					}
					if(compare(start+j, end-j-1)) {//유사회문이면
						if(palindrome(start+j, end-j-1)) {
							answer=1; 
							break;
						}
					}
					answer=2;  //회문이 아닌 경우 
					break;
				}
			}
			System.out.println(answer); //회문인경우 
		}
		
	}

	static boolean compare(int a, int b) {
		if(s.charAt(a)!=s.charAt(b)) return false; 
		return true;
	}
	
	static boolean palindrome(int a, int b) { 
		while(b-a>=0 ) {
			if(s.charAt(a)!=s.charAt(b)) return false;
			a++; b--;
		}
			return true;
	}
	
	
}