※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1213번 문제인 팰린드롬 만들기이다.
문제는 아래 링크를 확인하자.

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

 

1213번: 팰린드롬 만들기

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

www.acmicpc.net

팰린드롬(회문)은 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다.

 

팰린드롬 문자열은 위의 성질때문에, "길이가 홀수인 경우의 정가운데 들어가는 글자"를 제외하면 모든 글자는 짝수개 있어야 함을 알 수 있다.

 

따라서 A부터 Z까지의 문자의 개수를 각각 세고, 홀수개인 문자가 2개 이상이면 불가능, 그 외의 경우에는 A서부터 순서대로 절반개씩 찍어낸 뒤 홀수개 문자를 집어넣고 역순으로 찍어내면 된다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int arr[128];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	string s; cin >> s;
	for (auto letter : s) arr[letter]++;
	
	int odd = 0; char oddletter = 0;
	for (int i = 0; i < 128; i++) {
		int cnt = arr[i];
		if (cnt & 1) {
			odd++;
			oddletter = i;
		}
	}

	if (odd > 1) cout << "I'm Sorry Hansoo";
	else {
		for (int i = 'A'; i <= 'Z'; i++) {
			for (int j = 0; j < arr[i] / 2; j++) {
				cout << char(i);
			}
		}
		if (odd) cout << char(oddletter);
		for (int i = 'Z'; i >= 'A'; i--) {
			for (int j = 0; j < arr[i] / 2; j++) {
				cout << char(i);
			}
		}
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1068 // C++] 트리  (0) 2021.06.07
[BOJ 2647 // C++] 검은점과 하얀점 연결  (0) 2021.06.06
[BOJ 1043 // C++] 거짓말  (0) 2021.06.04
[BOJ 1208 // C++] 부분수열의 합 2  (0) 2021.06.03
[BOJ 1593 // C++] 문자 해독  (0) 2021.06.02

+ Recent posts