문제
임한수와 임문빈은 서로 사랑하는 사이이다.
임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.
임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.
임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.
입력
첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int[] count = new int[26];
for (int i = 0; i < str.length(); i++) {
count[str.charAt(i) - 'A']++;
}
StringBuilder sb = new StringBuilder();
int odd = 0;
int center = 0;
for (int i = 0; i < count.length; i++) {
if (count[i] % 2 != 0) {
odd++;
center = i;
}
if(odd>=2) {
System.out.println("I'm Sorry Hansoo");
return ;
}
}
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i] / 2; j++) {
sb.append((char)(i+'A'));
}
}
String result = sb.toString();
if (odd == 1) {
result += (char)(center + 'A');
}
result += sb.reverse().toString();
System.out.println(result);
}
}
생각보다 시간이 오래걸린 문제였다.
알파벳 A부터 count 배열의 인덱스 0 에서부터 순서대로 저장하기 위해
count[str.charAt(i) - 'A']++;
아스키코드를 사용하여 알파벳의 개수를 저장해줬다.
이후 로직을 생각할때, 처음에는 str의 길이가 홀수냐 짝수냐에 따라서 알고리즘을 작성하려 했다
하지만 이 방법보다 단순히 홀수개의 알파벳이 한 개 보다 많으면 길이의 홀,짝 여부에 상관없이 팰린드롬이 안된다는 것을 발견했다.
StringBuilder를 사용했는데 이때
for (int j = 0; j < count[i] / 2; j++)
j 의 count[i]/2 를 생각하지 못하고 count 배열값의 반까지만 돌리면서 -- 를 사용해 해당 index의 값이 0이되면 넘어가게 하려고해서 시간이 오래 걸렸다.
저 코드 하나 생각을 못하다니 종강해서 그런가 머리가 돌아가지도 않고 멍청해진것같다
아스키코드값을 사용하는것은 쉽게 떠오르지만 아직 코드가 바로 작성되진 않는다
count[str.charAt(i) - 'A']++;
// str.charAt(i) = 'B' 이면 count[1] ++
sb.append((char)(i+'A'));
// i가 0 이면 (char)(0+65) 이므로 A 반환
result += (char)(center + 'A');
마지막에 홀수의 개수가 1개일 경우에는 해당 인덱스의 char 값을 result 중간에 더해주고, reverse한 값을 다시 더해 return 해주면 된다.