23.08.07 계륵 일기

E woo·2023년 8월 7일

계륵 일기

목록 보기
15/31
post-thumbnail

팰린드롬

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;
}

사실 한번에 풀지 못해서 강의와 정답을 봐버렸다...(나중에 풀어볼 목록에 추가해야지!)

뭔가 어렴풋한 아이디어가 떠올라서 그것대로 구현해봤더니 반례가 생겼을 때 생각하기도
어려웠고 당연히 틀렸고 막히게 되었다.

문제를 풀기 전에 정답에 도달하는 아이디어를 처음부터 끝까지 생각하고 구현하자!!!


if else 문

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

  • 1번
if (!my_s.empty() && my_s.top() == str[i])
	my_s.pop();
else
	my_s.push(str[i]);
  • 2번
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 를 추가해주어야 한다.

profile
뒘벼

0개의 댓글