이해 중에 끄적인 낙서...
import java.util.Stack;
class Solution {
public static String solution(String p){
String answer = "";
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
int i = 0;
char c;
// <1단계>
if (p.isEmpty()) return "";
// <2단계>
c = p.charAt(i++);
stack.push(c);
if (c=='('){
while(!stack.isEmpty()){
c = p.charAt(i++);
if (c==')') stack.pop();
else stack.push(c);
}
}
else {
while(!stack.isEmpty()){
c = p.charAt(i++);
if (c=='(') stack.pop();
else stack.push(c);
}
}
String u = p.substring(0,i);
String v = p.substring(i);
// <3단계>
if (correct(u)){
sb.append(u);
sb.append(solution(v));
}
// <4단계>
else {
sb.append('('); // <4-1>
sb.append(solution(v)); // <4-2>
sb.append(')'); // <4-3>
for (int j=1; j<u.length()-1; j++){ // <4-4>
if (u.charAt(j)=='(') sb.append(')');
else sb.append('(');
}
}
answer = sb.toString();
return answer;
}
public static Boolean correct(String u){
Stack<Character> stack = new Stack<>();
for (int i=0; i<u.length(); i++){
char c = u.charAt(i);
if (c=='(') stack.push(c);
else{
if (stack.empty()) return false;
else stack.pop();
}
}
return true;
}
}
StringBuilder를 이용해서 문자열을 붙인 후 리턴했다.
문제에서 제시한 풀이 단계를 주석으로 달아 놨다.
뒤쪽 문자열 v는 재귀로 리턴값 얻음
correct 메소드는 전에 풀었던 문제 코드 복붙