[백준] 팰린드롬 만들기

0

백준

목록 보기
219/271
post-thumbnail
post-custom-banner

[백준] 팰린드롬 만들기

input: AAABB
answer: ABABA
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	string name;
	cin >> name;
	int nameLen = name.length();

	if (nameLen == 1) {
		cout << name;
		return 0;
	}

	//name에 각 알파벳이 몇 번 나왔는지 저장
	//ex. alphabet['A'-65] = A가 name에 나오는 횟수
	vector<int> alphabetCnt(26, 0);
	for (int i = 0; i < nameLen; ++i) {
		alphabetCnt[name[i] - 65]++;
	}

	//팰린드롬을 만들 때 사용할 알파벳들의 아스키코드
	vector<int> alphabets;

	//팰린드롬 문자열
	string pldr = "";

	if ((nameLen % 2) == 0) {
		//이름의 길이 짝수인 경우
		//모든 알파벳 짝수 개 있어야 팰린드롬 가능
		bool flag = true;
		for (int i = 0; i < 26; ++i) {
			if ((alphabetCnt[i] % 2)==0){
				//2n번 나타난 알파벳 -> alpabets에 n번 저장
				for (int j = 0; j < alphabetCnt[i]; j += 2) {
					alphabets.push_back(65 + i);
				}
			}
			else {
				flag = false;
				break;
			}
		}
		if (!flag) {
			cout << "I'm Sorry Hansoo";
			return 0;
		}

		//사전순으로 제일 앞서는 팰린드롬 만들기 위해 정렬
		sort(alphabets.begin(), alphabets.end());
		for (int i = 0; i < alphabets.size(); ++i) {
			pldr += char(alphabets[i]);
		}
		//팰린드롬 만들기
		reverse(alphabets.begin(), alphabets.end());
		for (int i = 0; i < alphabets.size(); ++i) {
			pldr += char(alphabets[i]);
		}

		cout << pldr;
	}
	else {
		//이름의 길이 홀수인 경우
		//홀수 번 나타나는 알파벳 하나 존재
		//나머지 알파벳들은 짝수 번 존재
		bool flag = true;
		int solo = -1; //1번 나타나는 알파벳의 아스키코드
		for (int i = 0; i < 26; ++i) {
			if ((alphabetCnt[i] % 2)==0) {
				//2n번 나타난 알파벳 -> alpabets에 n번 저장
				for (int j = 0; j < alphabetCnt[i]; j += 2) {
					alphabets.push_back(65 + i);
				}
			}
			else if (solo == -1) {
				//2n+1번 나타난 알파벳 -> alpabets에 n번 저장
				for (int j = 0; j < alphabetCnt[i]-1; j += 2) {
					alphabets.push_back(65 + i);
				}
				solo = 65 + i;
			}
			else {
				flag = false;
				break;
			}
		}
		if ((!flag) || (solo == -1)) {
			cout << "I'm Sorry Hansoo";
			return 0;
		}

		//사전순으로 제일 앞서는 팰린드롬 만들기 위해 정렬
		sort(alphabets.begin(), alphabets.end());
		for (int i = 0; i < alphabets.size(); ++i) {
			pldr += char(alphabets[i]);
		}
		//홀수 번 나타난 알파벳 팰린드롬 정가운데에 위치
		pldr += char(solo);
		//팰린드롬 만들기
		reverse(alphabets.begin(), alphabets.end());
		for (int i = 0; i < alphabets.size(); ++i) {
			pldr += char(alphabets[i]);
		}

		cout << pldr;

	}
	return 0;
}
profile
Be able to be vulnerable, in search of truth
post-custom-banner

0개의 댓글