[Backjoon] [1213] 팰린드롬 만들기 JAVA 실버3
문제
임한수와 임문빈은 서로 사랑하는 사이이다.
임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.
임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.
임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.
입력
첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.
오답원인
본인은 알파벳에 따른 count 수를 자바의 HashMap을 사용했다. 그러면 [A:1, B:4, C:4 .... ] 와 같이 Hashmap형태로 저장된다. 이를 통해서 팰린드롬을 구현하려했고 코드를 그렇게 작성했으나!!!
제출 결과는 무한 오답이었다.이후 오답의 원인을 찾아보니 원인은 HashMap에 있었다.
[A:1, B:4, C:4 .... ] 와 같은 형태의 HashMap을 사용한다고 하면 알파벳 순서대로 뽑아서 사용할 수 있을거라 생각했지만, HashMap은 순서를 보장하지 않는다. 이점이 내가 문제를 틀린 핵심원인이다. 소스코드 내용은 맞았다.
따라서 자료구조를 HashMap대신 TreeMap을 사용하면 의도한 결과를 얻을수 있을것이다.
틀린원인 : HashMap 사용
아래는 Hash을 사용한 오답예시
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String st = sc.nextLine();
String t = st;
HashMap<String, Integer> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
for(int i=0;i<st.length();i++) {
String s = String.valueOf(st.charAt(i));
if ( map.containsKey(s)) {
map.put(s,map.get(s)+1);
} else
{
map.put(s, 1);
}
}
st = "";
int cnt = 0;
for (Map.Entry<String, Integer> entry : map.entrySet()) { // HashMap Values와 Key를 순차적으로 참조 entrySet()
String Key = entry.getKey();
int Value = entry.getValue();
if(Value % 2 ==1) {
st = st.concat(Key);
for(int i=0;i< Value/2;i++) {
sb.append(Key);}
cnt +=1 ;
}
else {
for(int i=0;i< Value/2;i++) {
sb.append(Key);}}
}
String st2 = sb.toString();
char[] ca = st2.toCharArray();
Arrays.sort(ca);
StringBuilder sb2 = new StringBuilder();
sb2.append(ca);
//sb_Right = sb.reverse(); 이렇게 쓰면 sb도 뒤집어져버림
if( map.size() == 1) {
System.out.println(t);
}
else {
if (cnt > 1) {
System.out.println("I'm Sorry Hansoo");
}else {
if(cnt == 1)
System.out.println(sb2 + st +sb2.reverse());
else
System.out.println(sb2.toString() +sb2.reverse().toString());
}
}
}
}