https://www.acmicpc.net/problem/1213
팰린드롬 문자열을 만들고 만들 수 없는 것 또한 판별하는 문제이다.
팰린드롬은 ABA, AABCBAA 처럼 거꾸로 읽어도 동일한 대칭인 문자열이다.
구현하는 아이디어는 먼저 기존의 문자열에서 개수가 홀수인 문자가 2개 이상 있으면
팰린드롬을 만들 수 없고
홀수가 하나만 존재하는 문자는 문자열의 중앙에 위치하면 된다.
그리고 짝수로 존재하는 문자들은 중앙에서
chr + mid
mid + chr
형식으로 2개씩 붙이면서 진행하면 된다.
#include <bits/stdc++.h>
using namespace std;
char cnt[100] = {
0,
};
int main()
{
string str;
cin >> str;
for (char a : str)
cnt[a]++;
char mid;
int flag = 0;
string ret = "";
for (int i = 'Z'; i >= 'A'; i--)
{
if (cnt[i])
{
if (cnt[i] % 2 == 1)
{
mid = char(i);
flag++;
cnt[i]--;
}
if (flag == 2)
break;
for (int j = 0; j < cnt[i]; j += 2)
{
ret = char(i) + ret;
ret += char(i);
}
}
}
if (mid)
ret.insert(ret.begin() + ret.size() / 2, mid);
if (flag == 2)
cout << "I'm Sorry Hansoo";
else
cout << ret;
return 0;
}
사실 한번에 풀지 못해서 강의와 정답을 봐버렸다...(나중에 풀어볼 목록에 추가해야지!)
뭔가 어렴풋한 아이디어가 떠올라서 그것대로 구현해봤더니 반례가 생겼을 때 생각하기도
어려웠고 당연히 틀렸고 막히게 되었다.
문제를 풀기 전에 정답에 도달하는 아이디어를 처음부터 끝까지 생각하고 구현하자!!!
https://www.acmicpc.net/problem/3986
if (!my_s.empty() && my_s.top() == str[i])
my_s.pop();
else
my_s.push(str[i]);
if (!my_s.empty())
{
if (my_s.top() == str[i])
my_s.pop();
}
else
my_s.push(str[i]);
2번 코드는 1번 코드에서의 if 문에 두 개의 조건을
하나씩 나누어 구현해서 같은 동작을 할 것 같지만
이후 나오는 else 로 인해 두 개의 코드는 다른 동작을 하게 된다.
2번 코드를 1번 코드와 같이 하고자 한다면
두번째 if 에 대한 else 로 첫번째 if 의 else 를 추가해주어야 한다.