https://www.acmicpc.net/problem/1213
<코드>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str;
int alpha[26]={0};
cin>>str;
for(int i=0;i<str.size();i++)
{
alpha[str[i]-'A']++;
}
int cnt=0;
string frontans="";
string centerans="";
string backans="";
for(int i=0;i<26;i++)
{
if(alpha[i]%2==1){
cnt++;
centerans+=i+'A';
}
for(int j=0;j<alpha[i]/2;j++)
{
frontans+=i+'A';
}
for(int k=0;k<alpha[25-i]/2;k++)
{
backans+=25-i+'A';
}
}
if(cnt>1) {
cout<<"I'm Sorry Hansoo";
return 0;
}
else
{
if(frontans!="")
{
cout<<frontans;
}
if(centerans!="")
{
cout<<centerans;
}
if(backans!="")
{
cout<<backans;
}
}
}
<풀이과정>
우선적으로 알파벳의 가중치를 할당시켜준다.(alpha[str[i]-'A']++) 예시를 들어 AABBCC라고 가정하면 순차적으로 alpha[0],alpha[1],alpha[2]의 개수를 2개 늘려줘야 한다. ('A'-'A'=0,'B'-'A'=1,'C'-'A'=2)가 되기 때문이다.
그리고 팰린드롬은 알파벳의 개수가 홀수인 경우가 2개이상이 되면 팰린드롬을 만들 수 없다. 예시를 들어 AAABBB는 좌우가 대칭인 팰린드롬을 만들 수 없다.
그리고 순서대로 앞부분(알파벳의 개수가 짝수개인데 오름차순 정렬된 알파벳), 중간부분(알파벳의 개수가 홀수), 뒷부분(알파벳의 개수가 짝수개인데 내림차순 정렬된 알파벳)을 더해주고 출력해주면 끝이다.
'PS > 문자열 알고리즘[String]' 카테고리의 다른 글
백준 5052 전화번호 목록(c++) (0) | 2022.08.29 |
---|---|
백준 16916 부분 문자열(c++) (0) | 2022.07.13 |
백준 15353 큰 수 A+B(c++) (0) | 2022.07.12 |
백준 11478 서로 다른 부분 문자열의 개수(c++) (1) | 2022.07.11 |
백준 1120 문자열(c++) (0) | 2022.07.08 |