또 다시 등장한 펠린드롬 녀석.. 다만 다른 것은 "유사 회문"이라는 것이 존재한다
문자열에서 "한 문자만" 삭제 했을 때, 회문이 된다면 그 녀석은 "유사 회문" 이다
한 번에 아이디어를 생각하지는 못했다... 투 포인터를 사용하는데, 하나는 앞에서부터 하나는 뒤에서부터 문자가 같은지 비교한다. 만약 다른게 나온 경우, 남은 부분 문자에서, 앞에 꺼를 삭제 해본 뒤 펠린드롬인지 확인, 그리고 뒤에 꺼를 삭제해본 뒤 펠린드롬인지 확인. 즉 두번 확인하는 방법을 거쳐, 하나라도 펠린드롬이 나온다면, 그 문자열은 "유사 회문" 이라고 판단.
"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; } }
다음에 풀었을 때는 혼자 힘으로 맞히고 싶은 문제다!