Algorithm

[BOJ] 팰린드롬 만들기 1213번 C++

따봉치치 2024. 1. 18. 19:15
728x90

문제

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

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

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

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

입력

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

출력

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

 

접근 방식

 

가장 먼저 문자열로 팰린드롬을 만들 수 있는지 여부를 확인해야 한다.

이는 세가지 경우로 나올 수 있다

1. 문자열의 각 문자가 짝수 번 나올경우 => 팰린드롬 가능

2. 문자열의 문자가 홀수 번 나오는 경우가 1번인 경우 => 홀수번 나오는 문자열을 가운데 놓고 짝수번 나오는 문자들을 앞뒤로 놓으면 되므로 팰린드롬 가능

3. 홀수 번 나오는 문자가 2번 이상인 경우 => 홀수가 여러개기 때문에 팰린드롬 불가능

 

 

따라서 각 문자열의 문자가 몇번 나오는지 개수를 확인하고

문자가 홀수번인 경우가 몇번 있는지 확인하면 된다!

그리고 나서 팰린드롬이 가능한 경우에는

앞 뒤로 문자열을 나눠주고

앞 문자열은 순서대로

뒤 문자열은 역순으로 붙여주면 된다

 

코드

#include<bits/stdc++.h>
using namespace std;

int alpha[26];

int main() {
    string str; cin>>str;
    for(auto c : str) alpha[c-'A']++;

    int oddCnt = 0;
    char oddChar;

    for(int i=0; i<26; i++) {
        if(alpha[i] % 2 == 1) {
            oddCnt++;
            oddChar = i + 'A';
        }
    }
    if(oddCnt > 1) {
        cout<<"I'm Sorry Hansoo";
    }
    else {
        string st, en;

        for(int i=0; i<26; i++) {
            string tmp(alpha[i] / 2,'A'+i);
            st += tmp;
            en = tmp + en;
        }

        if(oddCnt == 1) {
            st += oddChar;
        }
        cout<<st+en;
    }
    

}
728x90