์ฒ์์ )()(() ์ธ ๊ฒฝ์ฐ u= [ )( ] ์ v= [ )(() ] ๋ก ๋๋ ๋ค "()" + "()" +"()" ๊ฐ ๋์ด์ "()()()" ์ธ์ค ์์์ง๋ง,
๊ณผ์ ์ด ์ข ๋ฌ๋๋ค.
)( ์์ ์ ๋ค ๋ฌธ์์ด์ ์ ๊ฑฐํ๋ฉด "" ๋น ๋ฌธ์์ด๋ง ๋จ๋๋ค.
๋ฐ๋ผ์, '(' ๋ฅผ ๋ถ์ด๊ณ v= [ )(() ] ๋ฅผ ๋ค์ 1๋จ๊ณ๋ถํฐ ์งํํ ๋ฌธ์์ด์ ๋ถ์ด๊ณ ')' ๋ฅผ ๋ถ์ธ๋ค.
v = [ )(() ] ๋ฅผ ๋ค์ 1๋จ๊ณ๋ฅผ ์์ํ๋ฉด u = [ )( ] ์ v = [ () ] ๋ก ๋๋ ์ ์์ผ๋ฏ๋ก
u๋ ๋ ๋ค์ ๋น ๋ฌธ์์ด์ด ๋๊ณ '(' ๋ฅผ ๋ถ์ด๊ณ v = [ () ] ๋ฅผ ๋ค์ 1๋จ๊ณ๋ถํฐ ์งํํ ๋ฌธ์์ด์ ๋ถ์ด๊ณ ')' ๋ฅผ ๋ถ์ธ๋ค.
v๋ฅผ ๋์์ผ๋ก ๋ 1๋จ๊ณ๋ฅผ ์งํํ๋ฉด, ์์ ๋ฌธ์์ด์ด๋ฏ๋ก () ๊ฐ ๋ฐํ๋๋ค.
๋ฐ๋ผ์ ์ผ๋ จ์ ๊ณผ์ ์ run() ์ด๋ผ๊ณ ํ๋ค๋ฉด
run( [ )()(() ] ) = '(' + run( [ )(()] ) + ')' = '(' + '(' + run( [ () ] ) + ')' + ')' = '(' + '(' + '()' + ')' + ')' = '((()))' ๊ฐ ๋๋ค.
์์ฒ๋ผ ๊ทธ๋ฅ ๋ฌธ์ ๊ฐ ์๋ ค์ค ๋๋ก ์ ๊ตฌํํ๋ฉด ๋๋ค.
package LV2.๊ดํธ๋ณํ;
class Solution {
StringBuilder ans;
public String solution(String p) {
ans = new StringBuilder();
run(p);
return ans.toString();
}
void run(String str){
if(isRight(str)){
ans.append(str);
return;
}else{
String[] result = separate(str);
String u = result[0];
String v = result[1];
if(!isRight(u)){
ans.append("(");
run(v);
ans.append(")"+convert(u));
}else{
run(u);
run(v);
}
}
}
String convert(String str){
if(str.length()==2){
return "";
}
StringBuilder sb = new StringBuilder();
for(int i=1;i<str.length()-1;i++){
if(str.charAt(i)=='('){
sb.append(')');
}else{
sb.append('(');
}
}
return String.format("%s",sb.toString());
}
String[] separate(String str){
char ch = str.charAt(0);
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
if(str.charAt(i)==ch){
sb.append(ch);
}else{
sb.deleteCharAt(sb.length()-1);
if(sb.length()==0){
return new String[]{str.substring(0,i+1),str.substring(i+1)};
}
}
}
return new String[]{str,""};
}
boolean isRight(String str){
int i = str.length()/2;
while(i-->0){
str = str.replace("()","");
}
if(str.length()==0){
return true;
}else{
return false;
}
}
}