[백준 1213] 팰린드롬 만들기 (C++ 풀이) - soo:bak
작성일 :
문제 링크
설명
주어진 문자열의 알파벳을 재배열하여 팰린드롬을 만들 수 있는지 판단하고,
가능하다면 사전순으로 가장 앞서는 팰린드롬을 출력하는 문제입니다.
팰린드롬은 앞에서부터 읽든 뒤에서부터 읽든 동일한 문자열을 의미하며,
이를 만들기 위해서는 다음과 같은 조건을 만족해야 합니다:
- 문자열 길이가 짝수인 경우: 모든 알파벳의 개수가 짝수여야 합니다.
- 문자열 길이가 홀수인 경우: 한 가지 알파벳만 홀수 개수를 가질 수 있으며, 나머지는 모두 짝수여야 합니다.
접근법
먼저 입력 문자열의 각 알파벳 개수를 셉니다.
이 때, 홀수 개수의 알파벳이 2개 이상 존재하는 경우에는 팰린드롬을 만들 수 없습니다.
그 외의 경우에는 다음과 같이 구성합니다:
- 왼쪽 절반: 알파벳 순서대로 절반만큼의 문자를 추가합니다.
예를 들어C
가4번
나온다면"CC"
를 추가합니다. - 가운데 문자: 홀수 개수의 알파벳이 존재한다면, 해당 문자를 중앙에
1개
추가합니다. - 오른쪽 절반: 왼쪽 절반의 역순을 그대로 이어 붙입니다.
이렇게 구성하면 팰린드롬 구조를 유지하면서도,
가장 앞쪽 알파벳부터 선택하여 사전순으로 가장 빠른 문자열이 됩니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
class Program {
static void Main() {
string input = Console.ReadLine();
int[] count = new int[26];
foreach (char c in input)
count[c - 'A']++;
int odd = 0;
foreach (int x in count)
if (x % 2 != 0) odd++;
if (odd > 1) {
Console.WriteLine("I'm Sorry Hansoo");
return;
}
string first = "", mid = "";
for (int i = 0; i < 26; i++) {
if (count[i] % 2 != 0)
mid += (char)(i + 'A');
first += new string((char)(i + 'A'), count[i] / 2);
}
char[] arr = first.ToCharArray();
Array.Reverse(arr);
string second = new string(arr);
Console.WriteLine(first + mid + second);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int count[26] = {};
string s; cin >> s;
for (char c : s)
++count[c - 'A'];
int odd = 0;
for (int i = 0; i < 26; ++i)
if (count[i] % 2) ++odd;
if (odd > 1) {
cout << "I'm Sorry Hansoo\n";
return 0;
}
string ans = "";
for (int i = 0; i < 26; ++i)
ans += string(count[i] / 2, 'A' + i);
for (int i = 0; i < 26; ++i)
if (count[i] % 2) ans += 'A' + i;
for (int i = 25; i >= 0; --i)
ans += string(count[i] / 2, 'A' + i);
cout << ans << "\n";
return 0;
}