어떤 문자열이 앞으로 읽어도, 뒤로 읽어도 똑같으면 그것을 팰린드롬이라고 한다.
여기에, 해당하는 문자열의 중심을 기점으로 접두사와 접미사 역시 팰린드롬인 것을 '아카라카 팰린드롬'이라고 정의하고, 주어진 문자열이 아카라카 팰린드롬임을 확인해야 한다.
먼저 해당 문자열이 앞으로 읽어도, 뒤로 읽어도 같은지 판단한다.
for (int i = 0; i < str.size(); i++)
{
if (str[i] != str[str.size() - 1 - i])
{
return false;
}
}
접두사(prefix), 접미사(postfix)를 구분한다. 이 때, 문자열 길이가 짝수인 경우와 홀수인 경우를 다르게 나눠 줘야 한다. (자칫하면 문자열을 나누는 과정에서 에러가 날 수 있다.)
if (str.length() % 2 == 0)
{
prefix = str.substr(0, str.length() / 2);
suffix = str.substr(str.length() / 2, str.length());
}
else
{
prefix = str.substr(0, str.length() / 2);
suffix = str.substr(str.length() / 2 + 1, str.length());
}
사실, 문자열이 절반으로 뚝 떨어지는 경우도 이 문제에서 요구하는 "아카라카 팰린드롬"이 맞는지 의문이었기에 처음에는 문자열 길이가 짝수이면 그냥 false를 반환할까, 하는 고민도 해 보았지만 우선적으로 짝수인 경우와 홀수인 경우를 나눠서 접근하기로 했고 일단 그 코드로 정답을 도출해 냈다.
#include <iostream>
using namespace std;
bool isAkarakaPalindrome(string str)
{
if (str.length() == 1)
{
return true;
}
bool result = false;
string prefix, suffix;
if (str.length() % 2 == 0)
{
prefix = str.substr(0, str.length() / 2);
suffix = str.substr(str.length() / 2, str.length());
}
else
{
prefix = str.substr(0, str.length() / 2);
suffix = str.substr(str.length() / 2 + 1, str.length());
}
for (int i = 0; i < str.size(); i++)
{
if (str[i] != str[str.size() - 1 - i])
{
return false;
}
}
if (isAkarakaPalindrome(prefix) && isAkarakaPalindrome(suffix))
{
result = true;
}
return result;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string inputStr;
cin >> inputStr;
if (isAkarakaPalindrome(inputStr))
{
cout << "AKARAKA";
}
else
{
cout << "IPSELENTI";
}
}
어려울 것이 없는 문제였음에도 두 번 틀렸다. 그 이유는 틀렸을 때 출력해야 하는 "IPSELENTI"를 "IBSELENTI"로 오타를 내 놓은 것을 놓쳤기 때문이다. 이게 연습이었기에 침착하게 찾을 수 있었지만 실전이었다면 내가 침착하게 찾아낼 수 있었을까? 아마 말려 버렸을 것 같다... 더 차분하게 코딩하는 습관을 들여야겠다.
'프로그래밍 > 백준 복기' 카테고리의 다른 글
[수학] 백준 1629: 곱셈 (0) | 2024.04.04 |
---|---|
[자료구조] 백준 1655: 가운데를 말해요 (0) | 2024.03.03 |
[구현] 백준 1347: 미로 만들기 (0) | 2024.01.16 |
[BruteForce] 백준 16197: 두 동전 (0) | 2024.01.09 |
[BruteForce] 백준 1107: 리모컨 (1) | 2024.01.06 |