PS_Baekjoon
[백준 C++] 1213번 : 펠린드롬 만들기
SMILELY
2023. 3. 18. 14:35
https://www.acmicpc.net/problem/1213
풀이 :
- 주어진 문자열을 펠린드롬으로 즉, 앞에서 읽었을 때와 뒤에서 읽었을 때 똑같은 문자열로 만들어야 한다.
- 펠린드롬으로 만들 수 없다면 I'm Sorry Hansoo를 출력한다.
- 펠린드롬으로 만들 수 없는 경우는 주어진 문자열의 알파벳 갯수 중 홀수인 알파벳이 2개 이상인 경우이다.
- 따라서 홀수인 알파벳이 몇 개인지가 제일 중요하다.
- 2개 이상이라면 만들 수 없고, 1개라면 중간에 홀수인 알파벳을 출력한다.
- 사전순이라고 했기 때문에 알파벳을 카운트한 배열을 오름차순으로 탐색하며 출력하고,
다시 내림차순으로 탐색하며 출력하면 자연스럽게 정렬된 상태로 펠린드롬을 만들 수 있다.
코드 :
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(){
cin.tie(NULL);
ios::sync_with_stdio(false);
int alphabet[30] = {0, }, cnt = 0;
string s;
char flag, ans;
cin >> s;
for(int i=0; i<s.size(); i++){
alphabet[s[i]-'A']++; //int배열이기 때문에 'A'를 빼고 알파벳 갯수를 세어준다
}
for(int i=0; i<27; i++){
if(alphabet[i]%2 == 1){
cnt++; //홀수인 알파벳이 몇 개인지 세어준다
flag = i+'A'; //cnt가 1일 경우 중간에 한번 출력해줘야 하기 때문에 flag에 저장해둔다
}
}
if(cnt > 1){ //cnt가 1보다 크다면 펠린드롬을 만들 수 없다
cout << "I'm Sorry Hansoo";
}else{
for(int i=0; i<27; i++){ //0부터 올라가며 탐색을 한다
if(alphabet[i] > 0){
for(int j=0; j<alphabet[i]/2; j++){ //펠린드롬으로 만들기 위해 갯수의 절반까지만 출력한다
ans = i+'A'; //바로 출력하면 아스키코드로 나와서 char 변수에 넣고 출력해줬다
cout << ans;
}
}
}
if(cnt == 1){ //for문이 끝났다는건 절반을 출력했다는 것
cout << flag; //홀수가 하나 있을 경우 해당 알파벳을 출력한다
}
for(int i=27; i>=0; i--){ //위에서부터 내려오며 탐색한다
if(alphabet[i] > 0){
for(int j=0; j<alphabet[i]/2; j++){
ans = i+'A';
cout << ans;
}
}
}
}
cout << '\n';
}