프로그래머스
괄호 변환 C++
by paysmile
2020. 11. 2.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
pair<string, string> DevideString(string p) {
//u,v로 나누기
int left = 0;
int right = 0;
string u, v;
for (int i = 0; i<p.size(); i++) {
if (p[i] == '(')
left++;
else
right++;
if (left == right) {
u = p.substr(0, i + 1);
v = p.substr(i + 1, p.size() - i);
break;
}
}
return make_pair(u, v);
}
bool CheckRightString(string u) {
//u가 올바른 괄호 문자열인지 확인
int left = 0;
int right = 0;
bool flag = true;
for (int i = 0; i<u.size(); i++) {
if (u[0] == ')') {
flag = false;
break;
}
if (u[i] == '(')
left++;
else
right++;
if (left<right) {
flag = false;
break;
}
}
return flag;
}
string GetAnswer(string p) {
string answer, u, v;
if (p.size() == 0)
return p;
bool flag = true;
pair<string,string> str = DevideString(p);
u = str.first;
v = str.second;
flag = CheckRightString(u);
//u가 올바른 괄호 문자열임
if (flag == true) {
answer += u;
p = v;
answer += GetAnswer(v);
}
//u가 올바른 괄호 문자열이 아님
else {
answer += '(';
answer += GetAnswer(v);
answer += ')';
if (u.size() > 2)
{
u.erase(0, 1);
u.erase(u.size() - 1, 1);
for (int i = 0; i < u.size(); i++) {
if (u[i] == '(')
answer += ')';
else
answer += '(';
}
}
}
return answer;
}
string solution(string p) {
return GetAnswer(p);
}
int main(void) {
string p = "(()())()";
cout << solution(p) << endl;
return 0;
}