문제 링크: https://www.acmicpc.net/problem/17609

 

17609번: 회문

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

www.acmicpc.net

 

 

문제를 접할 때 회문이 아닐 경우에 for문을 중첩해서 한 글자씩 빼낸 후 확인을 했을 경우 시간초과가 나왔다. (해당 코드 첨부)

import java.math.BigInteger;
import java.util.*;
import java.io.*;
public class Main {
static int t;
static boolean check;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t= Integer.parseInt(br.readLine());
for(int i=0; i<t; i++){
String s = br.readLine();
if(check(s)){
System.out.println(0);
continue;
}
else{
for(int j=0; j<s.length(); j++){
if(ReCheck(s,j)){
check=true;
break;
}
}
}
if(check){
System.out.println(1);
}
else{
System.out.println(2);
}
check=false;
}
}
public static boolean check(String str){
int left = 0;
int right = str.length()-1;
while(left<=right){
if(str.charAt(left)!=str.charAt(right)){
return false;
}
left++;
right--;
}
return true;
}
public static boolean ReCheck(String str, int index){
String string = makeNewString(str, index);
return check(string);
}
public static String makeNewString(String str, int index){
String str1 = str.substring(0, index);
String str2 = str.substring(index + 1);
return str1.concat(str2);
}
}

 

그래서 양쪽 끝을 하나씩 비교하고 틀렸을 경우 양쪽을 번갈아 빼고 비교를 하여 for문을 하나 줄였다.

 

import java.math.BigInteger;
import java.util.*;
import java.io.*;
public class Main {
static int t;
static String s;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t= Integer.parseInt(br.readLine());
for(int i=0; i<t; i++){
s = br.readLine();
if(check(0, s.length()-1)){
System.out.println(0);
}
else{
if(ReCheck(0,s.length()-1)){
System.out.println(1);
}
else{
System.out.println(2);
}
}
}
}
public static boolean check(int left, int right){
while(left<=right){
if(s.charAt(left)!=s.charAt(right)){
return false;
}
left++;
right--;
}
return true;
}
public static boolean ReCheck(int left, int right){
while(left<=right){
if(s.charAt(left)!=s.charAt(right)){
boolean a = check(left+1,right);
boolean b = check(left, right-1);
if(!a && !b){
return false;
}
else{
return true;
}
}
left++;
right--;
}
return true;
}
}

 

 

 

-- 다른 알고리즘보다 문자열이 가장 어려운 거 같다.. --