Algorithm/baekjoon

회문

마닐라 2022. 7. 23. 16:38

📍 문제 설명

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

 

17609번: 회문

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

www.acmicpc.net

 

💡 접근

회문이 아닌 경우에 왼쪽 문자를 무시하거나 오른쪽 문자를 무시하여 회문을 확인하는 절차가 필요하다

 

1. StringBuilder의 deleteChatAt 사용하는 방법

2. 팰린드롬 아닐경우 해당 양 옆의 문자를 제거하여 팰린드롬 재확인하는 방법

 

StringBuilder의 경우 shift 과정 때문에 메모리를 약 2배 더 잡아먹었다.

 

👩‍💻 코드

import java.io.*;
import java.util.*;

public class Main {
    static boolean[][] visited;
    static int n, m, k, t;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Main main = new Main();

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        for (int tc = 0; tc < n; tc++) {
            StringBuilder sb = new StringBuilder(br.readLine());

            if(sb.toString().equals(sb.reverse().toString())) {
                System.out.println(0);
                continue;
            }
            for (int i = 0; i < sb.length()/2; i++) {
                if(sb.charAt(i) != sb.charAt(sb.length()-i-1)) {
                    //다른 부분으로 문자열 만들어서 다시 체크
                    StringBuilder sb1 = new StringBuilder(sb);
                    StringBuilder sb2 = new StringBuilder(sb);
                    sb1.deleteCharAt(i);
                    sb2.deleteCharAt(sb.length()-i-1);
                    if(sb1.toString().equals(sb1.reverse().toString())
                            || sb2.toString().equals(sb2.reverse().toString())) {
                        System.out.println(1);
                    } else {
                        System.out.println(2);
                    }
                    break;
                }
            }
        }
    }

}
import java.io.*;
import java.util.*;

public class Main {
    static boolean[][] visited;
    static int n, m, k, t;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Main main = new Main();

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        for(int tc = 0; tc < n; tc++) {
            String str = br.readLine();

            //회문일 경우
            if(palindromeCheck(0, str.length()-1, str)) System.out.println(0);
            //회문아닐 경우(유사회문인지, 유사회문도 아닌지 판단)
            else
                if(palindromeReCheck(0, str.length()-1, str)) System.out.println(1);
                else System.out.println(2);
        }


    }

    private static boolean palindromeReCheck(int lt, int rt, String str) {
        while(lt < rt) {
            if(str.charAt(lt) != str.charAt(rt)) {
                //lt 이전 것과 rt 이후 것들은 판단 완료한 상태이니 그 이후 문자열들 check
                //lt 무시하고 그 이후 확인
                boolean a = palindromeCheck(lt + 1, rt, str);
                //rt 무시하고 그 이후 확인
                boolean b = palindromeCheck(lt, rt - 1, str);
                //팰린드롬되는 거 하나도 없으면 아무것도 아니다.
                if(!a && !b) return false;
                else return true;
            }
            lt++; rt--;
        }
        return true;
    }

    private static boolean palindromeCheck(int lt, int rt, String str) {
        while(lt < rt) {
            if(str.charAt(lt) != str.charAt(rt)) return false;
            lt++; rt--;
        }
        return true;
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

샘터  (0) 2022.07.26
일루미네이션  (0) 2022.07.26
이중 우선순위 큐  (0) 2022.07.21
ZOAC  (0) 2022.06.13
순열 정렬  (0) 2022.06.10