문제
https://school.programmers.co.kr/learn/courses/30/lessons/60058
주어진 순서에 따라 괄호를 올바르게 바꾸는 문제였다. 그냥 시키는대로 따라서 코드를 작성하기만 하면 됐다.
풀이 방법
4번째 순서에 대한 코드를 작성할 때, u의 괄호를 반대로 저장하는 부분을 u를 뒤집어서 저장하도록 만들어서 조금 헤맸다; 이런 실수는 대체 왜 하는걸까? 집중력의 문젠가? 졸리긴 했음;
#include <string>
#include <vector>
#include <stack>
using namespace std;
bool isEmptyString(string str){
if(str == ""){
return true;
}
else return false;
}
int separateString(string str){
int left=0, right=0;
int i=0;
for(i=0;i<str.size();i++){
if(str[i] == '('){
left++;
}
else{
right++;
}
if(left == right){ //균형잡힌 문자열 -> u,v 분리
break;
}
}
return i; //마지막까지 균형잡히지 않은 경우
}
bool isRightString(string str){
stack<int> s;
for(int i=0;i<str.size();i++){
if(str[i] == '('){
s.push(1);
}
else{
if(!s.empty()){
s.pop();
}
else return false;
}
}
return true;
}
string reverseString(string str){
int i;
string returnString = "";
for(i=0;i<str.size();i++){
if(str[i] == '('){
returnString +=')';
}
else returnString+='(';
}
return returnString;
}
string dfs(string p){
string u="", v="";
int i,j;
if(isEmptyString(p)) return ""; //1단계
else{
//2단계 (분리)
int index = separateString(p);
for(i=0;i<=index;i++){
u+=p[i];
}
for(i=i;i<p.size();i++){
v+=p[i];
}
//3단계
if(isRightString(u)){
return u+dfs(v);
}
else{ //4단계
string str="";
if(!isEmptyString(u)){
for(j=1;j<u.size()-1;j++){
str+=u[j];
}
}
u = reverseString(str);
return '('+dfs(v)+')'+u;
}
}
}
string solution(string p) {
string answer = "";
answer = dfs(p);
return answer;
}