본문 바로가기

코딩테스트 연습/프로그래머스

[프로그래머스/코딩테스트 연습] 괄호 변환

문제는 정말 써진 그대로만 풀면 되는 문제이다.

하지만 이게 이해하는데 애를 먹었다... ㅠㅜ 그대로 따라하기가 도데체 어떻게 하라는 건지 

어려움을 겪었다. 

우선 

'균형잡힌 괄호 문자열' 과 '올바른 괄호 문자열'로 나누어 판단이 되는데 이걸 위해서 함수를 두개 선언해 주었다. 

올바른 문자열이라 Right STRing = rstr
균형잡힌 문자열이라 Balanced STRing = bstr

 

그리고 찬찬히 방법을 따라 갔다.

우선 처음에 u,v를 나누는 기준부터 이해가 잘 안갔는데, u는 더 이상 균형잡힌 문자열로 다시 나누어 질 수 없으므ㄴ로, 

최소한의 균형잡힌 문자열로 하기 위해서 2개씩 끊어서 검사하였다.

이것만 제대로 해결하면 될 줄알았는데, 

u,v 자체가 순서가 계속 햇갈려서 틀려왔다...ㅋㅋㅋ 처음에는 return을 '('+rl(u)+')'+v로 하고 그랬다가 틀려서 한참 고민했다.. 

차근 차근 따라 가면 해결 할 수 있었다... 

 

def rstr(p):
    if p =='':
        return True 
    t = 0
    for i in p:
        if i =='(':
            t+=1
        elif i ==')':
            t-=1 
            if t< 0 :
                return False 
    if t == 0 : 
        return True 
    return False 
def bstr(p):
    return p.count('(')== p.count(')')
def rl(u):
    a = ''
    for i in u[1:-1]:
        if i =='(':
            a+=')'
        if i == ')':
            a+='('
    print('a:',a)
    return a 
def solution(p):
    if rstr(p): 
        return p
    for i in range(2,len(p),2):
        if bstr(p[:i]):
            u = p[:i]
            v = p[i:]
            break
    else: 
        u,v = p,''
    if rstr(u):
        v = solution(v)
        return u+v
    else :
        return "("+solution(v)+")"+rl(u)

아.. 그리고 효율성때문에 재귀로 부르는거 안하려고 했는데.. 

문제 없길래 그냥 재귀로 썼다...