본문 바로가기
알고리즘/백준 문제풀이

백준 [자바 java] 17609 : 회문

by 잔디🌿 2023. 7. 14.

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

     

    17609번: 회문

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

    www.acmicpc.net

     

    처음에는 자료구조 시간에 회문 문제 스택으로 풀라고 했던 것 기억나서 그렇게 했는데 시간초과가 났다.

    그래서 문제를 자세히 살펴보니 투포인터로 하는게 훨씬 효율적이었다.

    여기서 두 포인터의 char값이 다를 때 값을 옮겨주는 과정에서 옮긴 후 모든 것들은 회문이어야 한다는 조건을 빼먹어서 틀렸습니다가 나왔다.

     

    주의할 점 

    구현 까다로우면 더 쉬운 방법 있나 한번 더 생각하기

    반례 더 있나 깊게 생각하기

     

    import java.util.*;
    import java.io.*;
    import java.math.*;
    
    
    public class Main {
    
        static char[] arr;
    
        static int check(int a, int b){
            int fir = a;
            int sec = b;
    
            while(fir<sec){
                if(arr[fir] != arr[sec]){
                    return 0;
                }
                fir++;
                sec--;
            }
            return 1;
        }
    
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            int n = Integer.parseInt(br.readLine());
    
            for (int i = 0; i < n; i++) {
                String k = br.readLine();
    
                arr = k.toCharArray();
    
                int fir = 0;
                int sec = arr.length-1;
    
                int ans = 0;
    
                while(fir < sec){
    
                    if(arr[fir] != arr[sec]){
                        if(ans != 0) {
                            ans = 2;
                            break;
                        }
                        if(arr[fir+1] == arr[sec] && check(fir+1, sec) == 1){
                            fir++;
                            ans++;
                        }
                        else if(arr[fir] == arr[sec-1] && check(fir, sec-1) == 1){
                            sec--;
                            ans++;
                        }
                        else{
                            ans =2;
                            break;
                        }
                    }
                    fir++;
                    sec--;
                }
    
                System.out.println(ans);
    
    
            }
        }
    }