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

One-nt·2022년 8월 10일
0

백준

목록 보기
13/19
post-custom-banner

문제 출처

사용 언어: Java

  1. 구상
  • 입력받은 알파벳마다의 개수를 기록
    → 팰린드롬이 되려면 0 or 짝수개를 가져야 하거나 홀수개의 알파벳은 0 or 1개만 가능
    → 알파벳은 26개이므로 크기가 26인 배열을 만들고 아스키 코드를 이용하여 알파벳 분류

  • 팰린드롬 결과를 저장하는 배열 생성
    앞을 가리키는 변수 front와 뒤를 가리키는 변수 back을 두어 알파벳을 front 위치에 넣고 front을 한 칸 앞으로 이동, back 위치에도 알파벳을 넣고 back을 한 칸 앞으로 이동

  • front, mid, back이라는 StringBuffer를 만들어 알파벳을 넣으면서 팰린드롬 만들기
    → 홀수개인 알파벳이 있으면 1개는 mid에 넣고 나머지는 front, back에 개수가 0이 될 때까지 번갈아서 넣기
    알고리즘 참고 링크

  1. 구현
import java.util.*;
import java.lang.*;
import java.io.*;

public  class Main {	
	
	//팰린드롬 결과를 저장하는 문자열
	public static StringBuffer front = new StringBuffer();
	public static StringBuffer mid = new StringBuffer();
	public static StringBuffer back = new StringBuffer();
	
	//알파벳마다의 갯수를 저장하는 배열
	public static int[] alpha = new int[26];	
	
	
	
	public static void main(String[] args) throws Exception {
		Scanner s = new Scanner(System.in);
		
		//문자열 입력 받기
		String str = s.next();	
		
		
		//문자열에 알파벳 각각 몇 개 있는지 세기
		for (int i = 0; i < str.length(); i++) {
			//아스키 코드를 이용하여 알파벳 갯수 세기
			int idx = str.charAt(i) - 'A';
			alpha[idx]++;
		}
		
		/*알파벳 중 홀수개를 가진 알파벳 갯수 세기 
        (1개 이상이면 팰린드롬 불가)*/
		int ODD = 0;
		
		for (int i = 0; i < alpha.length; i++) {
			if (alpha[i] % 2 != 0)
				ODD++;
		}
		
		int num = 0;
		
        /*홀수개인 알파벳이 1개 이상이면 팰린드롬 불가이므로 
        해당 문구 출력*/
		if (ODD > 1)
			System.out.println("I'm Sorry Hansoo");
		 
		
		else {
			for (int i = 0 ; i < alpha.length; i++) {
            	/*홀수개인 알파벳이라면 mid에 1개를 넣고 
                나머지는 front, back에 나눠서 넣기*/
				if (alpha[i] % 2 == 1) {
					num = i;
					mid.append((char)(num+65));
					alpha[i]--;
					
					while (alpha[i] != 0) {
						front.append((char)(i + 65));
						alpha[i]--;
						back.append((char)(i+65));
						alpha[i]--;
					}
					
				}
				
                //0이 아닌 짝수개의 알파벳은 front, back에 나눠 넣기
				else if (alpha[i] != 0){
					while (alpha[i] != 0) {
						front.append((char)(i + 65));
						alpha[i]--;
						back.append((char)(i+65));
						alpha[i]--;
					}
					
					
				}
				
				else
					continue;
					
			}
			
			
			
			
		}
		
		//출력 (StringBuffer이므로 String으로 변환하기)
		System.out.print(front.toString() + mid.toString() + back.reverse().toString());
		
				
	}
	
	
	
	
	
} 
post-custom-banner

0개의 댓글