처음에는 stack을 이용한 해결방법을 떠올리고 문제를 풀이했는데 다른 반례는 모두 맞았지만 xabba와 같이 마지막 스택에 값이 남고 이것이 다른 경우에 1을 출력하는게 되지 않았다.
정답을 찾아보니 투 포인터를 이용해 해결 할 수 있는 문제였고, 만약 투포인터를 떠올렸다면 쉽게 해결 할 수 있었을 것이다. 투 포인터를 이용할때 재귀 방식을 이용했는데 그 이유는 ababbabaa 와 같은 문제가 있을때 a와 b중 어떤 것을 제거했을때 맞는 방식인지 알 수 없기에 두가지 경우의 수를 모두 구해보기 위해서이다.
#include <iostream>
#include <stack>
using namespace std;
int n;
stack<char> s;
//현재 입력받은 길이의 절반만큼 스택에 문자들을 넣고 절반이 지났을때 스택의 top들과 남은 문자들을 비교함 그런데 만약 현재 문자와 스택의 top이 다를경우 제외 할 수 있으면 제외하고
//진행하는데 스택의 값을 제외할지 남은 문자에서 제외할지는 다음 값들을 보고 해야할듯 그런데 다음 값들을 제외하더라도 맞지 않으면 그냥 2출력하고 break
//그런데 제외하더라도 아니면 그냥 2출력 제외하고 되면 1출력 제외하지 않아도 되면 0
//abba
//summuus
//xabba
//xabbay
//comcom
//comwwmoc
//comwwtmoc
//
//0
//1
//1
//2
//2
//0
//1
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
int flag = 0;
string h;
cin >> h;
int k = h.length();
int w;
if (k % 2 == 0) {
w = k / 2;
}
else {
w = (k / 2)+1;
}
//문자열의 절반 만큼 넣기
for (int j = 0; j < (k/2); j++) {
s.push(h[j]);
}
for (int j = (k / 2); j < k; j++) {
// 스택의 top과 남은 문자가 같을때 (0)
if (s.top() == h[j]) {
s.pop();
}
// 스택의 top과 남은 문자가 같지 않을때(1,2)
else if (s.top() != h[j]) {
//남은 문자열 중 제외하면 같은 경우 (1)
if (j + 1 < k && s.top() == h[j+1]) {
flag = 1;
s.pop();
j += 1;
}
else {
// 스택의 최상위를 pop 해보고 그래도 아니면 양쪽 방법 모두 아니닌까 그냥 flag = 2로 하고 마무리
s.pop();
if (s.top() == h[j] || s.empty()) {
flag = 1;
s.pop();
}
else {
flag = 2;
break;
}
}
}
}
if (flag == 1) {
cout << 1 << "\n";
}
else if (flag == 2) {
cout << 2 << "\n";
}
else if (flag == 0) {
cout << 0 << "\n";
}
}
return 0;
}
#include <iostream>
#include <stack>
using namespace std;
int n;
string in;
int c = 3;
void pal(int s, int e, bool check) {
while (s < e) {
if (in[s] == in[e]) {
s++;
e--;
}
else {
if (check == false) {
pal(s, e - 1, true);
pal(s + 1, e, true);
return;
}
else {
return;
}
}
}
c = check;
return;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> in;
c = 2;
pal(0, in.size() - 1, false);
cout << c << "\n";
}
return 0;
}