import java.util.*;

class Solution {
    int position;
    
    public String solution(String p) {
        String answer = fixParenthesis(p);
        return answer;
    }
    
    // 짝이 맞고 올바른 괄호인지 검사. 올바를 경우 true 반환
    public boolean isCorrect(String p) {
        int l = 0, r = 0;
        boolean correct = true;
        Stack<Character> stack = new Stack<>();	// stack 이용
        
        // stack에는 짝을 이루지 못한 '(' 보관. 즉, 비어있어야 올바른 괄호
        for(int i=0; i<p.length(); i++) {
            if(p.charAt(i) == '(') {
                l++;
                stack.push('(');	// '('만 stack에 넣음
            }
            else {
                r++;
                if(stack.isEmpty()) {	// 첫 괄호가 ')' 일 경우 올바르지 않은 괄호
                    correct = false;
                }
                else {	// 짝을 이룰 '(' 존재할 경우 빼기
                    stack.pop();                    
                }
            }
            
            // 균형잡힌 괄호 문자열의 최소를 구하기 위해
            // (, )의 개수가 같아지는 자리를 position에 저장
            if(l == r) {
                position = i+1;
                return correct;
            }
        }
        
        return correct;
    }
     
    public String fixParenthesis(String p) {
        if(p.isEmpty()) {
            return p;
        }
        String str;
        Boolean check = isCorrect(p);	// 올바른 괄호인지 검사
        
        // 문자열을 균형잡힌 괄호 문자열 u, v로 분리
        String u = p.substring(0, position);
        String v = p.substring(position);
        
        // 올바른 괄호일 경우 v에 대해 같은 과정 반복
        if(check) {
            return u + solution(v);
        }
        
        // 올바른 괄호가 아닐 경우 v에 같은 과정을 반복하여 얻은 문자열을 ( ) 사이에 추가
        else {
            str = "(" + solution(v) + ")";
        }
        // 그 문자열 뒤에 맨 처음과 마지막 괄호를 제외하고 나머지 괄호를 반대로 추가
        for(int j=1; j<u.length()-1; j++) {
            if(u.charAt(j) == '(')
                str += ")";
            else
                str += "(";
        }
        
        return str;
    }    
}

 

+ Recent posts