Java 코딩테스트 공부/Java 백준 문제풀이

자바 백준 17609번 문제 : 회문

daramG 2022. 12. 28. 13:06

문제 출처 : https://www.acmicpc.net/problem/17609

 

17609번: 회문

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

www.acmicpc.net

 

문제 :

 

풀이 :

회문인지 아닌지는 StringBuilder로 reverse()해서 확인하는 함수를 작성해둠

먼저 회문인지 아닌지 검사, 회문일 경우 바로 0 출력한다.

회문이 아닐 경우 유사회문인지, 둘 모두 해당되지 않는지 검사해야 하므로

투포인터를 왼쪽(lt) 오른쪽(rt)에 잡고 한칸씩 중앙으로 이동시키다 두 문자가 다른 경우

lt를 삭제한 문자열, rt를 삭제한 문자열을 각각 회문인지 아닌지 검사하는 함수로 보내서

둘 중 하나라도 회문이 되는 경우 유사회문이므로 1을 출력한다.

둘 다 해당하지 않는 경우엔 2를 출력하게 된다.

 

 

소스코드 :

import java.util.*;
class Main {
	// 회문인지 아닌지 판별
	public boolean reverseOk(String str) {
		String reverseStr = new StringBuilder(str).reverse().toString();
		if (str.equals(reverseStr)) return true;
		else return false;
	}
	// 유사회문인지 아닌지 판별
	public int reverseOk2(String str, int lt, int rt) {
		StringBuilder sb1 = new StringBuilder(str);
		StringBuilder sb2 = new StringBuilder(str);
		sb1.deleteCharAt(lt);
		sb2.deleteCharAt(rt);
		if (reverseOk(sb1.toString()) == true || reverseOk(sb2.toString()) == true) return 1;
		else return 2;
	}
	// 회문 : 0 , 유사회문 : 1 , 둘 다 아니면 2
	public int solution(String str) {
		int answer = 2;
		int lt = 0, rt = str.length() - 1;
		char[] strChar = str.toCharArray();
		if (reverseOk(str)) return 0;
		else {
			while (lt < rt) {
				if (strChar[lt] == strChar[rt]) {
					lt++;
					rt--;
				}
				else if (strChar[lt] != strChar[rt]) {
					return reverseOk2(str, lt, rt);
				}
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		String[] arr = new String[n];
		for(int i=0; i<n; i++) {
			arr[i] = sc.next();
		}
		for(int i=0; i<n; i++) {
			System.out.println(T.solution(arr[i]));
		}
	}
}