ALGORITHM/프로그래머스 | 백준 | 삼성 | 카카오

[백준] 17609번 회문

SZCODE 2021. 3. 21. 17:23

www.acmicpc.net/problem/17609

 

17609번: 회문

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

www.acmicpc.net

문제 설명 : 

회문이면 0, 유사회문이면 1, 그 외는 2를 출력

 

문제 풀이 : 

두 포인터로 문자열의 앞 부분, 뒷 부분을 각각 증가 감소 시키면서 중앙 부분에서 만날 때까지 검사합니다.

만약 회문이 아니면 left를 넘어가서 검사하거나 right를 넘어가서 검사해서 중앙 부분에서 만난다면 유사회문이 됩니다.

유사 회문은 한 문자를 삭제하는 것이 조건입니다.

import java.util.Scanner;

public class Main{
	static int answer;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int tc = 0; tc < T; tc++) {
			
			String s = sc.next();
			answer = solv(s);
			
			System.out.println(answer);
			
		}
	}
	public static int solv(String s) {
		answer = 0; 
		int left = 0, right = s.length()-1;
		
		while(left<right) {
			if(s.charAt(left) == s.charAt(right)) {
				//회문이면 
				left ++; 
				right--;
			}
			else {
				//회문이 아니면 
				int leftcopy = left, rightcopy = right;

				//left skip
				leftcopy++;
				while(leftcopy<rightcopy) {
					if(s.charAt(leftcopy)==s.charAt(rightcopy)) {
						leftcopy++;
						rightcopy--;
					}
					else {
						answer++;
						break; // 다 확인할 필요가 없음
					}
				}
				
				leftcopy = left; rightcopy = right;
				//right skip
				rightcopy--;
				while(leftcopy<rightcopy) {
					if(s.charAt(leftcopy)==s.charAt(rightcopy)) {
						leftcopy++;
						rightcopy--;
					}
					else {
						answer++;
						break;
					}
				}
				
				return answer;
			}
		
		}
		return answer;
	}
}