문제에서 주어진데로 재귀로 구현하면 된다...
1~4까지 너무 구현을 할 수 있도록 깔끔하게 적어놔서 그대로 구현하면 된다.
#include <string>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
string solve(const string &p)
{
if(p.empty())
return "";
int balance = 0, start = 0, end = 0;
for(int i=0;i<p.size();i++) {
if(p[i] == '(')
balance++;
else
balance--;
if(balance == 0) {
end = i;
break;
}
}
string u = p.substr(start, end - start + 1);
string v = p.substr(end + 1, p.size() - end + 1);
stack<char> st;
bool is_right = true;
for(int i=0;i<u.size();i++) {
if(u[i] == '(')
st.push(u[i]);
else {
if(!st.empty())
st.pop();
else {
is_right = false;
break;
}
}
}
if(is_right)
return u + solve(v);
string e = "(" + solve(v) + ")";
u.erase(0, 1);
u.erase(u.size() - 1, 1);
for(int i=0;i<u.size();i++)
u[i] = u[i] == ')' ? '(' : ')';
e += u;
return e;
}
string solution(string p) {
return solve(p);
}