알고리즘/백준 문제풀이
백준 [자바 java] 17609 : 회문
잔디🌿
2023. 7. 14. 02:47
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
처음에는 자료구조 시간에 회문 문제 스택으로 풀라고 했던 것 기억나서 그렇게 했는데 시간초과가 났다.
그래서 문제를 자세히 살펴보니 투포인터로 하는게 훨씬 효율적이었다.
여기서 두 포인터의 char값이 다를 때 값을 옮겨주는 과정에서 옮긴 후 모든 것들은 회문이어야 한다는 조건을 빼먹어서 틀렸습니다가 나왔다.
주의할 점
구현 까다로우면 더 쉬운 방법 있나 한번 더 생각하기
반례 더 있나 깊게 생각하기
import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
static char[] arr;
static int check(int a, int b){
int fir = a;
int sec = b;
while(fir<sec){
if(arr[fir] != arr[sec]){
return 0;
}
fir++;
sec--;
}
return 1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String k = br.readLine();
arr = k.toCharArray();
int fir = 0;
int sec = arr.length-1;
int ans = 0;
while(fir < sec){
if(arr[fir] != arr[sec]){
if(ans != 0) {
ans = 2;
break;
}
if(arr[fir+1] == arr[sec] && check(fir+1, sec) == 1){
fir++;
ans++;
}
else if(arr[fir] == arr[sec-1] && check(fir, sec-1) == 1){
sec--;
ans++;
}
else{
ans =2;
break;
}
}
fir++;
sec--;
}
System.out.println(ans);
}
}
}