알고리즘
[Java] 백준 17609번 회문
J3SUNG
2023. 6. 22. 03:10
728x90
투포인터 문제입니다.
3 가지 경우가 있습니다.
1. 문자의 좌우가 대칭되는경우 회문 (0)
2. 문자의 한글자를 빼서 대칭되는 경우 유사 회문 (1)
3. 둘다 아닌 경우 (2)
왼쪽과 오른쪽에 각각 포인터를 둡니다.
두 위치에서 값이 같은지 확인하고 같으면 한칸씩 안쪽으로 이동합니다.
왼쪽과 오른쪽의 위치가 같아지거나 왼쪽이 더 커진 경우 반복을 멈춥니다.
만약 값이 다른 경우 한글자를 뺄 수 있으므로 2가지 경우가 가능합니다.
1. 왼쪽을 뺀 경우
2. 오른쪽을 뺀 경우
1번의 경우 왼쪽만 한칸 오른쪽으로 이동해서 위의 과정을 반복합니다.
2번의 경우 오른쪽만 한칸 왼쪽으로 이동해서 위의 과정을 반복합니다.
위의 경우 이미 한 글자를 지웠으므로 체크를 해둡니다.
결과적으로 2가지 경우가 발생합니다.
1. 왼쪽과 오른쪽의 위치가 같아지거나 왼쪽이 더 커져서 반복을 멈춘 경우
2. 한 글자가 지워진 상태에서 또 값이 일치하지 않은 경우
1번의 경우 - 글자를 지운적이 없다면 => 회문 (0)
1번의 경우 - 글자를 지운적이 있다면 => 유사 회문 (1)
2번의 경우 - 회문과 유사회문이 아님 (2)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
static int result;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
String s;
for (int ts = 0; ts < t; ++ts) {
result = 2;
s = br.readLine();
check(s, 0, s.length() - 1, 0);
bw.write(result + "\n");
}
bw.close();
}
public static void check(String s, int left, int right, int type) {
if (left >= right) {
result = type;
return;
}
if (s.charAt(left) != s.charAt(right)) {
if (type == 0) {
check(s, left + 1, right, 1);
if (result == 2) {
check(s, left, right - 1, 1);
}
return;
} else {
result = 2;
return;
}
}
if (s.charAt(left) == s.charAt(right)) {
check(s, left + 1, right - 1, type);
}
}
}