Computer Engineering/알고리즘 테스트

백준[1213] -팰린드롬 만들기

말하는호구마 2021. 2. 27. 02:25

팰린드롬이란 거꾸로 읽어도 제대로 읽는 것과 형태가 같은 문장을 이야기한다

(내이름은 이효리~ 거꾸로해도 이효리~)

 

진짜 작은 실수로 조금 오래걸렸다.

그리고 Collection을 많이 써서 시간 초과가 날까 걱정했지만 이정도는 괜찮은 것 같다. 

검색해보니 반례에 대해서 예민한 문제인 것 같다.

홀수개인 문자가 포함되어 있어도 이를 가운데 배치시키면 팰린드롬이 가능하다. 

 

 

https://www.acmicpc.net/problem/1213

 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    
    public static void main(String[] args) throws Exception {
       Scanner sc = new Scanner(System.in);
       String name = sc.nextLine();
       
       String result = "";
       HashMap<Character, Integer> hash = new HashMap<>();
       ArrayList<Character> make = new ArrayList<>();
       
       for(int i=0;i<name.length();i++){
           hash.put(name.charAt(i),hash.getOrDefault(name.charAt(i),0)+1);
       }//해당 글자가 몇개 나왔는지 세기 위함 

       int over=0;
       String mid="";
       for(Character key: hash.keySet()){
           if(hash.get(key) %2 !=0){
               over++;
               if(over==2){
                   System.out.println("I'm Sorry Hansoo");
                   return;
               }//만약 홀수개 문자가 하나 이상이면 실패 (하나면 중간에 배치할 수 있음)
               
               mid+=key;//중간에 배치하기 위해 따로 뺴둠 
               if(hash.get(key)!=1) {
                   for (int i = 0; i < (hash.get(key)-1) / 2; i++) {
                       make.add(key);
                   }
               }
               /**만약 한 문자가 1개가 아닌 3개,5개.... 라면 가운데 올 문자 하나 빼고 
                나머지 문자들은 정렬을 해서 넣어야 사전 순으로 출력됨 
                */
               continue;
           }
           for(int i=0;i<hash.get(key)/2;i++) {
               make.add(key);
           }//글자가 짝수개라면 그냥 list에 넣어버리기 
       }
        Collections.sort(make);
       for(int i=0;i<make.size();i++){
           result+=make.get(i);
       }
       result+=mid;
       //홀수일 때 가운데 배치시키기 
       for(int i=make.size()-1;i>=0;i--){
           result+=make.get(i);
       }

       System.out.println(result);
   }
}