백준 JAVA 17609번 회문
문제 링크: 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; } }

-- 다른 알고리즘보다 문자열이 가장 어려운 거 같다.. --
'Alogorithm > 문자열' 카테고리의 다른 글
백준 13022[자바] java 늑대와 올바른 단어 (0) | 2022.05.18 |
---|---|
백준 1786[자바] java 찾기 (0) | 2022.05.16 |
백준 JAVA 17413번 단어 뒤집기 2 (0) | 2021.12.27 |
백준 JAVA 16916번 부분 문자열 (0) | 2021.12.25 |
댓글
이 글 공유하기
다른 글
-
백준 13022[자바] java 늑대와 올바른 단어
백준 13022[자바] java 늑대와 올바른 단어
2022.05.18 -
백준 1786[자바] java 찾기
백준 1786[자바] java 찾기
2022.05.16 -
백준 JAVA 17413번 단어 뒤집기 2
백준 JAVA 17413번 단어 뒤집기 2
2021.12.27 -
백준 JAVA 16916번 부분 문자열
백준 JAVA 16916번 부분 문자열
2021.12.25
댓글을 사용할 수 없습니다.