
문제해석을 해보자면
입력받은 문자열이 반대로봐도 똑같은 문자열이라면 팰린드롬이다.
문자열 N 개를 입력받고 문자열 끼리 붙혔을 때도 팰린드롬이 된다면 그 최대길이를 구하는 문제
예를 들어서 #1 예시를 보면 racecar 는 앞으로 보나 뒤로보나 racecar 가되니까 팰린드롬이다.
#2 예시를 보면 abb , bba 자체는 팰린드롬이 아니지만 두문자열을 붙혔을때
abbbba 는 팰린드롬이 되는것을 볼 수 있다.
즉, 들어와있던 문자열을 뒤집어서 다음 문자열과 비교하는 방식으로 코드를 구현해보았다.
일단 팰린드롬 인지 아닌지의 여부를 알아야하고, 팰린드롬일때 최대 길이가 몇인지를 알아야한다.
package SWEA_24_05_09;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class D3_19003 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int result = 0;
boolean check = false;
Set <String> set = new HashSet<>();
for (int i = 0; i < N; i++) {
String str = br.readLine();
if (set.contains(str)){
result += M * 2;
}else {
if (!check && pal(str)){
check = true;
result += M;
}else {
StringBuilder sb = new StringBuilder(str);
set.add(sb.reverse().toString());
}
}
}
System.out.println("#" + test_case + " " + result);
}
}
static boolean pal(String str){
for (int i = 0; i < str.length()/2; i++) {
if (str.charAt(i) != str.charAt(str.length()-1 -i)){
return false;
}
}
return true;
}
}
check = 팰린드롬인지 여부를 확인하는 용도
문자열을 입력받고 , 이미 set에 있는 문자열이라면 그냥 result 값에 문자열길이를 2배해서 넣고,
pal 함수를 통해 그 자체가 팰린드롬인게 확인이 되었다면, 문자열길이만큼만 더해준다.
만약 그게 아니라면 StringBuilder 의 reverse 함수를 통해 뒤집은 문자열을 set 에 넣어준다
그래야 다음 문자열과 비교했을때 같다면 이라는 조건으로 넘어가기 때문