https://www.acmicpc.net/problem/25501
재귀 문제이다.
처음에는 아래와 같이 코드를 작성하였는데, 시간 초과가 발생하였다. 아무래도 예제 입력을 복사하고 붙여넣기 한 후 enter를 눌러야지만 코드가 돌아갔어서 그런 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int cnt;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
cnt = 0;
String input = br.readLine();
int result = isPalindrome(input);
System.out.println(result + " " + cnt);
}
br.close();
}
public static int recursion(String s, int l, int r) {
cnt ++;
String[] arr = s.split("");
if (l >= r) { //홀수 : 중앙에 도달(l==r), 짝수 : l은 커지고 r은 작아짐(l > r)
return 1;
} else if (!((arr[l]).equals(arr[r]))) {
return 0;
} else { //왼쪽 인덱스와 오른쪽 인덱스의 문자가 같으면
return recursion(s, l + 1, r - 1);
}
}
public static int isPalindrome(String s) {
return recursion(s, 0, s.length() - 1);
}
}
그래서 split 메소드를 사용하지 않고 charAt을 사용해 보았다(브론즈 문제이다 보니 초창기 코테를 풀 때 사용했었던 charAt으로 시도해 보았음). 그랬더니 시간 초과가 발생하지 않았고, split과 charAt의 차이점을 찾아보았다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int cnt;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
cnt = 0;
String input = br.readLine();
int result = isPalindrome(input);
System.out.println(result + " " + cnt);
}
br.close();
}
public static int recursion(String s, int l, int r) {
cnt++;
if (l >= r) { // 홀수: 중앙에 도달(l==r), 짝수: l은 커지고 r은 작아짐(l > r)
return 1;
} else if (s.charAt(l) != s.charAt(r)) {
return 0;
} else { // 왼쪽 인덱스와 오른쪽 인덱스의 문자가 같으면
return recursion(s, l + 1, r - 1);
}
}
public static int isPalindrome(String s) {
return recursion(s, 0, s.length() - 1);
}
}