백준 풀기

백준 1213번: 팰린드롬 만들기 with Java

삼겹살파튀 2024. 7. 27. 23:58

팰린드롬 만들기

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 30248 13037 9880 42.347%

문제

임한수와 임문빈은 서로 사랑하는 사이이다.

임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.

임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.

임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.

입력

첫째 줄에 임한수의 영어 이름이 있다. 알파벳 대문자로만 된 최대 50글자이다.

출력

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

예제 입력 1 복사

AABB

예제 출력 1 복사

ABBA

예제 입력 2 복사

AAABB

예제 출력 2 복사

ABABA

예제 입력 3 복사

ABACABA

예제 출력 3 복사

AABCBAA

예제 입력 4 복사

ABCD

예제 출력 4 복사

I'm Sorry Hansoo

 

 


 

주소를 치자마자 팰린드롬....!!!!!!! 팰린드롬 저 이거 알아요!!!!!!!!! 하고 신났었다

임한수 임문빈 머임 이름 누가 지은거야? 남남 이름 같은데 심지어 성도 같음 이름 너무 막 지었어 둘의 백일이면 사귀는 사이 아님? 

 

이번 미션은 임한수의 영어 이름을 팰린드롬으로 바꿔보기입니다.

임한수는 팰린드롬인 문자열을 세젤좋못사한답니다 약간 사이비스럽네요 시리얼은 오레오만 먹겠네ㅎ

백일 선물로 팰린드롬 문자열을 선물로 준다는데?? 이런 걸...??? 백일 선물을 공짜로 때우려는 문빈이의 속셈인걸까요...

예제들이 참 성의가 없네요 한수 영어 이름으로 AABB를 제시해서(어케 읽음 이거) 이름을 아빠로 바꿔버렸습니다.. 헤어지자는 건가?

팰린드롬 안다고 했지만 이런 로직은 잘 모르겠네요 하지만 일단 해볼게여 ㅎ

 

오 모르겠다

 

아아무것도모루겟습니다~!! 아 이거 어차피 아무도 안 읽으니까 신세한탄 좀 하겠습니다 사실 지금 돈 잃어서 제정신이 아님...진짜 죽을 것 같음 현실적으로 잊고서 공부나 하는 게 맞는데 왜 그게 안 되는지 모르겠다... 며칠간 한 10년 늙은 듯 현실적으로 내가 잃은 돈은 나흘 정도 쿠팡 뛰면 버는 돈인데 왜 며칠 간 이거 때문에 고민하고 있는지 근데 고민과 걱정과 우울과 분노를 멈출 수가 없어...... 고민할 시간에 쿠팡을 뛰러갔으면 돈 다 복구하고 너무 힘들어서 우울감 느낄 시간도 없었을 듯 ㅎ  지금 정처기도 떨어질텐데 이것도 또 시간과 돈을 잃는 거다....^^ 얼마를 잃은 거임 도대체;;;

 

넴 그냥 일기장이었구요! 그러면 다시 팰린드롬을 만들어줘 봅시다

입력을 받아서 char[] 로 바꿔서 어떻게 하면 되지 않을란지 싶어요

 

흠 오름차순 정렬한담에... 같은 문자열 나올 때까지 밀기 어때요....

홀수 개수 나오는 건 문자 하나만 허용이겠다 가운데쪽으로 놔야겠네... 근데 어떻게 하지?? 하핳 아니네 예제2를 보니 징검다리로 놨네

 

어... 어쩌지?? 일단 팰린드롬 없는 것부터 걸러야하나 근데 그러면 홀수개 문자가 2개 이상이면 안 되는데 이걸 어떻게... 하지? 배열을 순회하면서 개수를 세야할 것 같은데 뭐가 있는지도 모르는데!... -> 생각해보니까 전부 다 세면 되잖아 ㅎㅎ 이게 맞나

 

문자를 붙이는 거는 처음에 아예 앞 뒤로 붙이는 걸 생각했다. 근데 그게 쉽지 않았고 팰린드롬 성질 이용해서 반 쪼개서 하는 게 낫다는 걸 알게됨.. 어떻게 알았을까요 쉿 스트링빌더 이거 쓰면 쉽게 되자너 ㅎ 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_1213 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String name = br.readLine();
		char[] strName = name.toCharArray();
		Arrays.sort(strName);	// 일단 오름차순 정렬..
		
		int[] charCount = new int[26];	// 문자별 개수 세서 저장
        for (char c : strName) {
            charCount[c - 'A']++;
        }	// 해당 문자 나올 때마다 문자에 해당하는 인덱스 1씩 더해주기
		
        int oddCount = 0;	// 홀수 개수 세서 저장
        char middleChar = 0;	// 홀수 문자
        for (int i = 0; i < 26; i++) {
        	// 문자가 홀수일 때
            if (charCount[i] % 2 != 0) {
                oddCount++;	// 홀수 count에 더해줌 
                middleChar = (char) (i + 'A');	// 홀수 문자는 무조건 가운데!!!에 하나는 꼭 넣어줘야하니까 따로 저장
            }
            
            // 홀수 개수가 1 초과하면 팰린드롬 안 되니까 문장 출력하고 종료
            if (oddCount > 1) {
                System.out.println("I'm Sorry Hansoo");
                return;
            }
        }
        
        StringBuilder half = new StringBuilder();	// 팰린드롬 반쪽
        for (int i = 0; i < 26; i++) {
        	// 반쪽이니까 개수의 반만 붙여야 하니까..
            for (int j = 0; j < charCount[i] / 2; j++) {
                half.append((char) (i + 'A'));	// charCount 등장 개수 있으니까 그거 이용해서 붙여주기 
            }
        }
        
        StringBuilder result = new StringBuilder();	// 출력할 결과 저장
        result.append(half); // 앞부분
        if (middleChar != 0) {
            result.append(middleChar); // 중간 문자
        }
        result.append(half.reverse()); // 뒷부분
        
        System.out.println(result.toString());
    }
}

 

 

 

ㅇ[??? 틀릴 줄 알았는데 맞았네 아주 느리지만 성공...? 성공이네 휴