[백준, JAVA] 1213번 : 팰린드롬 만들기

seunguk noh·2023년 7월 27일
0

Algorithm

목록 보기
12/23

1. 문제

2. 아이디어

  • 처음에는 문자열을 한자리 씩 쪼개고, 배열에 담아서 찾아보고자 했다.
    주어진 문자열을 줄 세우는 모든 경우의 수는 N!이니 해볼만 하다는 생각이 들었기 때문이다.
    ('같은 것이 있는 순열'일 수 있으므로 엄밀히는 N!이 아닐 수 있겠지만 어차피 모든 경우를 다 탐색해볼 것이니..)

  • 그러나 위의 접근으로 N!개의 모든 문자열을 구하는 것에 실패하였고.. 각 알파벳의 등장 횟수가 홀수인가, 짝수인가, 홀수인 것이 몇개인가를 기준으로 생각하는 아이디어에 만감이 교차했다..^^;

3. 코드

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();
    }
}

4. 느낀점

  • 어떤 방식으로 풀 것인지.. 접근하는 관점의 중요성에 대해 다시 한번 느꼈다.

  • 때로는 하나씩 다 찾아보는 것이 유리할 수도 있지만, 문제 조건에 따라 기준/로직을 세워서 모든 케이스를 커버할 수 있다면 해당 방법이 더 깔끔하다.

0개의 댓글