알고리즘

백준 17609번 회문 (JAVA)

박카스마시며코딩 2022. 7. 14. 15:24

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

 

17609번: 회문

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

www.acmicpc.net

 

저는 해당 문제를 투포인터를 이용하여 문제를 해결하였습니다.

for문을 통해 먼저 회문인지를 확인하였습니다.

회문이 아니라면 유사회문인지를 투포인터를 통해 확인하였습니다.

회문이 아니라면 어디서 달라지는지를 보고 해당 부분에서 뒷문자열도 삭제해보고 앞문자열도 삭제해봐야 하기에 

회문이였는지를 확인하는 메서드를 앞문자열을 삭제해 확인하고 뒷문자열을 삭제해 확인해 둘 다 회문이 아니라고 나오면 일반 문자열로 리턴하였습니다.

 

package BOJ.twopoint;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.function.Function;

public class BOJ_17609 {
    private static final int PALINDROME = 0; // palindrome
    private static final int PSEUDO_PALINDROME = 1;
    private static final int NORMAL = 2;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        int testCnt = stoi.apply(br.readLine());
        for(int t = 0 ; t < testCnt ; t++){
            String s = br.readLine();
            int type = checkType(s);
            System.out.println(type);
        }
    }

    private static int checkType(String s) {
        int sIndex = 0;
        int eIndex = s.length()-1;
        if(isPalindrome(s,sIndex,eIndex)){
            return PALINDROME;
        }
        if(isPseudoPalindrome(s,sIndex,eIndex)){
            return PSEUDO_PALINDROME;
        }else{
            return NORMAL;
        }
    }
    private static boolean isPalindrome(String s, int sIndex,int eIndex){
        int halfSize = eIndex - sIndex;
        for(int i = 0 ; i < halfSize ; i++){
            if(s.charAt(sIndex+i) != s.charAt(eIndex-i)){
                return false;
            }
        }
        return true;
    }
    private static boolean isPseudoPalindrome(String s, int sIndex,int eIndex){
        while(sIndex < eIndex){
            if(s.charAt(sIndex) != s.charAt(eIndex)){
                boolean deleteEndIndex = isPalindrome(s,sIndex,eIndex-1);
                boolean deleteStartIndex = isPalindrome(s,sIndex+1,eIndex);
                if(!deleteEndIndex && !deleteStartIndex){
                    return false;
                }else{
                    return true;
                }
            }
            sIndex++;
            eIndex--;
        }
        return true;
    }
}