def divStr(p): # 문자열 u,v 분리
    leftCnt = 0
    rightCnt = 0
    
    for x in range(len(p)):
        if p[x]=='(':
            leftCnt += 1
        if p[x]==')':
            rightCnt += 1

        if leftCnt == rightCnt:
            return p[:x+1], p[x+1:] # u, v
    
def checkStr(u): # 올바른 괄호 문자열인지 체크
    stack = []
    for x in u:
        if x == '(':
            stack.append(x)
        else:
            if not stack:
                return False
            stack.pop()
    return True

def solution(p):
    answer = ''
    
    # 1번 - 빈 문자열이면 빈 문자열 반환
    if not p:
        return ""
        
    # 2번 - u, v으로 분리
    u, v = divStr(p)
    
    # 3번 - u가 올바른 문자열이면 v에 대해 1단계부터 수행
    # 수행한 결과 문자열을 u에 이어 붙이고 반환한다.
    if checkStr(u):
        return u + solution(v)
    else:
        # 4번 - u가 올바르지 않은 문자열인 경우
        # 4-1번 빈 문자열에 첫 번째 문자로 '(' 붙이기
        answer = '('
        
        # 4-2번 문자열 v에 대해 1단계부터 재귀적으로 수행하고 결과를 이어 붙이기
        answer += solution(v)
        
        # 4-3번 ')' 붙이기
        answer += ')'
        
        # 4-4번 u의 첫 번째 마지막 문자 제거, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙이기
        for x in u[1:len(u)-1]:
            if x == '(':
                answer += ')'
            else:
                answer += '('
        
    return answer

+ Recent posts