2022.03.05
길이가 1인 경우부터 N-1 이하인 경우까지 모든 접두사와 접미사가 주어진다. 따라서 N-1 길의이 문자열 + 하나의 문자
을 조합해서 N 길이의 문자열을 만들 수 있다. 그리고 만들어진 N 길이의 문자열 중 원래 문자열 S를 찾으면 된다.
같은 길이의 문자열은 접미사, 접두사인 경우로 2개씩 존재한다. 그리고 접미사인지 접두사인지 모르기 때문에 앞뒤의 경우를 따져야 한다. 따라서 총 8개의 경우만 비교해보면 된다. 예를들어 N-1 길이의 A, B 접미사와 접두사가 있고 길이 1의 a, b 접미사와 접두사가 있을 때, A + a, a + A, A + b, b + A, B + a, a + B, B + b, b + B 총 8개의 조합이 존재한다.
이제 각 조합으로 만들어진 문자열 temp가 유효한지 확인하기만 하면 된다.
이제 마지막으로 부분 문자열이 접미사인지 접두사인지 확인하여 출력하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
String[] origin = new String[2 * N - 2];
List<String>[] partOfOrigin = new List[N + 1];
for (int i = 1; i <= N; i++) {
partOfOrigin[i] = new ArrayList<>();
}
for (int i = 0; i < 2 * N - 2; i++) {
String str = br.readLine();
int len = str.length();
origin[i] = str;
partOfOrigin[len].add(str);
}
String answerWord = N == 2 ? origin[0] + origin[1] : findOriginString(partOfOrigin);
System.out.println(answerWord);
System.out.println(N == 2 ? "PS" : checkSuffixOfPrefix(origin, answerWord));
}
private static String findOriginString(List<String>[] partOfOrigin) {
for (String lastPartWord : partOfOrigin[N - 1]) {
for (String firstPartWord : partOfOrigin[1]) {
String answerWordA = lastPartWord + firstPartWord;
String answerWordB = firstPartWord + lastPartWord;
if (isValidAnswer(answerWordA, partOfOrigin)) {
return answerWordA;
}
if (isValidAnswer(answerWordB, partOfOrigin)) {
return answerWordB;
}
}
}
return "";
}
private static boolean isValidAnswer(String answerWord, List<String>[] partWords) {
for (int i = 1; i < N; i++) {
String wordA = partWords[i].get(0);
String wordB = partWords[i].get(1);
if (!answerWord.contains(wordA) || !answerWord.contains(wordB)) {
return false;
}
if (wordA.equals(wordB)) {
if (answerWord.indexOf(wordA) == answerWord.lastIndexOf(wordA)) {
return false;
}
}
}
return true;
}
private static String checkSuffixOfPrefix(String[] checkStrings, String targetString) {
StringBuilder answer = new StringBuilder();
Set<String> set = new HashSet<>();
for (String checkString : checkStrings) {
if (targetString.indexOf(checkString) == 0) {
if (!set.contains(checkString)) {
set.add(checkString);
answer.append("P");
} else {
answer.append("S");
}
} else {
answer.append("S");
}
}
return answer.toString();
}
}