# 본인 풀이
#include <bits/stdc++.h>
using namespace std;
int n, ret;
string s[100];
void solution(int idx, int pos){
if(s[idx].length() == 0){
ret += 1;
return;
}
if(pos == s[idx].length()){
return;
}
if(s[idx].length() == 1){
return;
}
if(s[idx].length() == 2 && s[idx][0] != s[idx][1]){
return;
}
if(s[idx][pos] == s[idx][pos+1]){
s[idx].erase(pos, 2);
solution(idx, 0);
}else{
solution(idx, pos + 1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
cin >> s[i];
solution(i, 0);
}
cout << ret << "\n";
return 0;
}
재귀로 풀이했는데 47%에서 시간초과가 발생하였다. AABBAA형태로 구성된 문자열이 있다고 가정했을때, 현재 조회중인 문자의 다음이 현재 문자와 동일한 경우 erase후 다시 처음부터 문자를 순회하는 방식이다. 아무래도 문자 삭제 후 처음부터 다시 순회하다 보니 시간복잡도가 기하급수적으로 늘어날 수 밖에 없는 구조이긴하다.
# 모범 답안
스택으로 풀자. 순회하는 문자가 스택 마지막 문자와 동일하면 pop하고 다음 문자를 순회한다. 순회를 마치고 스택에 문자가 남은경우 이는 선이 겹치는 경우가 된다.
#include <bits/stdc++.h>
using namespace std;
int n, ret;
string s[100];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
vector<char> v;
cin >> s[i];
for(char ch: s[i]){
if(v.size() > 0 && v[v.size() - 1] == ch){
v.pop_back();
continue;
}
v.push_back(ch);
}
if(v.size() == 0){
ret += 1;
}
}
cout << ret << "\n";
return 0;
}
C++에는 스택 타입을 네이티브로 지원한다. 아래는 모범 답안이다.
#include <bits/stdc++.h>
using namespace std;
int n, ret;
string s;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++){
cin >> s;
stack<char> stk;
for(char a: s){
if(stk.size() && stk.top() == a){
stk.pop();
}else{
stk.push(a);
}
}
if(stk.size() == 0){
ret++;
}
}
cout << ret << "\n";
return 0;
}