[BOJ] 17609 회문

iinnuyh_s·2023년 12월 28일
0

문자열

목록 보기
6/12
post-thumbnail

회문

풀이

  • 또 다시 등장한 펠린드롬 녀석.. 다만 다른 것은 "유사 회문"이라는 것이 존재한다

  • 문자열에서 "한 문자만" 삭제 했을 때, 회문이 된다면 그 녀석은 "유사 회문" 이다

  • 한 번에 아이디어를 생각하지는 못했다... 투 포인터를 사용하는데, 하나는 앞에서부터 하나는 뒤에서부터 문자가 같은지 비교한다. 만약 다른게 나온 경우, 남은 부분 문자에서, 앞에 꺼를 삭제 해본 뒤 펠린드롬인지 확인, 그리고 뒤에 꺼를 삭제해본 뒤 펠린드롬인지 확인. 즉 두번 확인하는 방법을 거쳐, 하나라도 펠린드롬이 나온다면, 그 문자열은 "유사 회문" 이라고 판단.

  • "summuus" 인 경우, 3번째문자 m, 뒤에서 3번째 문제 u에서 다름이 발생한다. 남은 문자열 "mmu"에서 먼저 m을 삭제해보면 "mu"가 남는데, 이건 펠린드롬이 아니다.
    하지만 "mmu"에서 "u"를 삭제해보면 "mm"이 남고, 이건 펠린드롬이다. 따라서 이 문자열은 "유사 회문"이다.

    🙆‍♀️ 정답 코드
    import java.util.*;
    import java.io.*;
    public class Main {
        public static void main(String[] args) throws Exception{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int T = Integer.parseInt(br.readLine());
            for(int i=0;i<T;i++){
                String str = br.readLine();
                //펠린드롬인지 아닌지 확인해
                if(checkPelin(str,0,str.length()-1)){
                    System.out.println("0");
                }else{
                    //아니었으면!
                    if(doubleCheck(str,0,str.length()-1)){
                        System.out.println("1");
                    }
                    else System.out.println("2");
                }
            }
        }
        private static boolean checkPelin(String str,int start, int end) {
            while(start<end){
                if(str.charAt(start)!=str.charAt(end)){
                    return false;
                }
                start++;
                end--;
            }
            return true;
        }
        private static boolean doubleCheck(String str, int start, int end){
           boolean prevDel = false;
           boolean lastDel = false;
            while(start<end){
                if(str.charAt(start)!=str.charAt(end)){
                    prevDel = checkPelin(str,start+1,end);
                    lastDel = checkPelin(str,start,end-1);
                    if(prevDel || lastDel) return true;
                    else return false;
                }
                start++;
                end--;
            }
            return true;
        }
    }
  • 다음에 풀었을 때는 혼자 힘으로 맞히고 싶은 문제다!

0개의 댓글