문제 출처 : https://www.acmicpc.net/problem/17609
문제 :
풀이 :
회문인지 아닌지는 StringBuilder로 reverse()해서 확인하는 함수를 작성해둠
먼저 회문인지 아닌지 검사, 회문일 경우 바로 0 출력한다.
회문이 아닐 경우 유사회문인지, 둘 모두 해당되지 않는지 검사해야 하므로
투포인터를 왼쪽(lt) 오른쪽(rt)에 잡고 한칸씩 중앙으로 이동시키다 두 문자가 다른 경우
lt를 삭제한 문자열, rt를 삭제한 문자열을 각각 회문인지 아닌지 검사하는 함수로 보내서
둘 중 하나라도 회문이 되는 경우 유사회문이므로 1을 출력한다.
둘 다 해당하지 않는 경우엔 2를 출력하게 된다.
소스코드 :
import java.util.*;
class Main {
// 회문인지 아닌지 판별
public boolean reverseOk(String str) {
String reverseStr = new StringBuilder(str).reverse().toString();
if (str.equals(reverseStr)) return true;
else return false;
}
// 유사회문인지 아닌지 판별
public int reverseOk2(String str, int lt, int rt) {
StringBuilder sb1 = new StringBuilder(str);
StringBuilder sb2 = new StringBuilder(str);
sb1.deleteCharAt(lt);
sb2.deleteCharAt(rt);
if (reverseOk(sb1.toString()) == true || reverseOk(sb2.toString()) == true) return 1;
else return 2;
}
// 회문 : 0 , 유사회문 : 1 , 둘 다 아니면 2
public int solution(String str) {
int answer = 2;
int lt = 0, rt = str.length() - 1;
char[] strChar = str.toCharArray();
if (reverseOk(str)) return 0;
else {
while (lt < rt) {
if (strChar[lt] == strChar[rt]) {
lt++;
rt--;
}
else if (strChar[lt] != strChar[rt]) {
return reverseOk2(str, lt, rt);
}
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for(int i=0; i<n; i++) {
arr[i] = sc.next();
}
for(int i=0; i<n; i++) {
System.out.println(T.solution(arr[i]));
}
}
}
'Java 코딩테스트 공부 > Java 백준 문제풀이' 카테고리의 다른 글
자바 백준 10986번 문제 : 나머지 합 (0) | 2023.01.11 |
---|---|
자바 백준 1990번 문제 : 소수인팰린드롬 (0) | 2023.01.10 |
자바 백준 1991번 문제 : 트리 순회 (0) | 2022.11.14 |
자바 백준 17298번 문제 : 오큰수 (0) | 2022.11.11 |
자바 백준 9935번 문제 : 문자열 폭발 (0) | 2022.11.10 |