처음에는 문자열을 한자리 씩 쪼개고, 배열에 담아서 찾아보고자 했다.
주어진 문자열을 줄 세우는 모든 경우의 수는 N!이니 해볼만 하다는 생각이 들었기 때문이다.
('같은 것이 있는 순열'일 수 있으므로 엄밀히는 N!이 아닐 수 있겠지만 어차피 모든 경우를 다 탐색해볼 것이니..)
그러나 위의 접근으로 N!개의 모든 문자열을 구하는 것에 실패하였고.. 각 알파벳의 등장 횟수가 홀수인가, 짝수인가, 홀수인 것이 몇개인가를 기준으로 생각하는 아이디어에 만감이 교차했다..^^;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main{
static int[] alphabet = new int[26]; //알파벳 개수 저장 배열
static StringBuilder sb = new StringBuilder(); //결과 저장할 StringBuilder
static StringBuilder front = new StringBuilder();
static StringBuilder end = new StringBuilder();
public static void main(String[] args) throws IOException {
//입력값 처리하는 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//결과값 출력하는 BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String name = br.readLine();
boolean check = false; //팰린드롬 만들 수 있는지 확인 변수
int oddCheck = 0; //알파벳 홀수인 개수
char mid = '0';
//알파벳 개수를 구하기
for(int i=0;i<name.length();i++)
alphabet[name.charAt(i) - 65]++;
//팰린드롬 만들기
for(int i=0;i< alphabet.length;i++){
if(alphabet[i] != 0 && alphabet[i]%2 == 1){
if(oddCheck==0){ //홀수가 1개가 될 때
oddCheck++;
mid = (char)('A' + i); //mid구하기
}else{ //홀수가 2개가 될 때
//팰린드롬 만들지 못하기 때문에 "I'm Sorry Hansoo"를 저장
sb = new StringBuilder("I'm Sorry Hansoo");
check = true;
break;
}
}
//"개수 ÷ 2"만큼 front, end 구성
for(int j=0;j<alphabet[i]/2;j++){
front.append((char)('A' + i));
end.insert(0, (char)('A' + i));
}
}
if(!check){ //팰린드롬 만들었을 때
if(mid == '0') //홀수 개수가 0개일 때
sb.append(front).append(end); //front + end
else //홀수 개수가 1개일 때
sb.append(front).append(mid).append(end); //front + mid + end
}
bw.write(sb.toString()); //팰린드롬 BufferedWriter 저장
bw.flush(); //결과 출력
bw.close();
br.close();
}
}
어떤 방식으로 풀 것인지.. 접근하는 관점의 중요성에 대해 다시 한번 느꼈다.
때로는 하나씩 다 찾아보는 것이 유리할 수도 있지만, 문제 조건에 따라 기준/로직을 세워서 모든 케이스를 커버할 수 있다면 해당 방법이 더 깔끔하다.