곧죽어도 콛잉

[구현 / BOJ 1213 / C++] 팰린드롬 만들기 본문

Coding Test/C++

[구현 / BOJ 1213 / C++] 팰린드롬 만들기

코드진행형 2023. 2. 7. 19:59

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

 

1213번: 팰린드롬 만들기

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

www.acmicpc.net

1) A부터 Z까지 각 문자의 개수를 확인하여 배열에 저장해준다.
2) 문자의 개수가 홀수라면, 그 문자를 가운데(mid) 문자로 지정하고 문자의 개수를 하나 빼주어 짝수 취급한다.
2-1) 문자의 개수가 홀수 인것이 두개이상 나오면(flag>=2) 불가능하다고 출력한다. 
3) 문자의 개수가 짝수라면, 할 수 있는 만큼 ret 문자열에 앞뒤로 한개씩 붙여준다.
4) mid가 존재한다면 ret 가운데에 mid를 삽입하고 출력한다.

이 문제에서 주어진 알파뱃이 palindrome을 이루러면 어떤 조건이어야되는지 알아야한다.

 

palinrome이 가능한 단어들을 생각해보면 답이 금방 나올 수 있다.

 

1) AABB 가능

2) ABA 가능

3) ABBBA 가능

4) AAABBB 불가능 

 

짝수개씩 있는 문자의 개수와 상관없이

홀수개씩 있는 문자가 여러개일 경우는 palindrome을 절대 만들 수 없다.

즉, 홀수개씩 있는 문자는 반드시 한 개 이하여야만 가능하다.

 

cnt[i]&1 은 홀수일 경우 참이라는 뜻이다.

 

cnt['A']++; 같은 표현을 눈여겨 보면 좋을 것 같다.

 

#include <bits/stdc++.h>

using namespace std;

string s, ret;
int cnt[200];
int flag;
char mid;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> s;
    for(char i : s) cnt[i]++;
    for(int i = 'Z' ; i >= 'A' ; i--){
        if(cnt[i]){
            if(cnt[i]&1){
                mid = char(i);
                flag++;
                cnt[i]--;
            }
            
            if(flag==2) break;
            
            for(int j = 0 ; j < cnt[i] ; j+=2){
                ret += char(i);
                ret = char(i) + ret;
            
            }
        }
    }
    
    
    if(mid) ret.insert(ret.begin() + ret.size()/2, mid);
    if(flag==2) cout << "I'm Sorry Hansoo";
    else cout << ret;
    
    
    
}
Comments