[프로그래머스 Python] 괄호변환

DongGu·2021년 4월 5일
0

https://programmers.co.kr/learn/courses/30/lessons/60058

함수는 두 개(splash, isBalanced)를 만들었다.
splash는 균형잡힌 괄호 문자열로 나누는 u, v를 만들어주는 함수다. u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 한다. 그래서 앞에서부터 체크하다 갯수가 같은 쌍이 나오면 종료시켜버린다.

isBalanced는 올바른 괄호 문자열인지 확인하는 함수다. 일단 이 함수를 어떻게 구현해야할지 고민하다, 실패했다. stack에 '('면 넣고, ')'면 빼는 아이디어를 캐치했다.

solution은 문제의 주어진 그대로 코딩하면 되는데, 재귀함수 구조를 아직 제대로 파악하지 못했다.

# txt => '균형잡힌 괄호 문자열'u & '균형잡힌 괄호 문자열'v
def splash(txt):
    temp = ''
    for i in range(len(txt)):
        temp = txt[:i+1]
        left_cnt = temp.count('(')
        right_cnt = temp.count(')')
        if (left_cnt == right_cnt):
            u = temp; v = txt[i+1:]
            return (u,v)

# 문자열 u가 올바른 괄호 문자열인지 확인하는 함수
def isBalanced(u):
    stack = []
    for p in u:
        # p가 '('라면 stack에 추가
        if p == '(':
            stack.append(p)
        # p가 ')'이면 stack에서 '('를 빼버림
        # 아직 반복문이 다 돌기 전에 stack이 비어버리면 대칭이 맞지 않음
        else:
            if not stack:
                return False
            stack.pop()  
    return True
 
 
def solution(w):
    # 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
    if w == '':
        return ''
    # 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 
    u, v = splash(w)

    # 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 

    if (isBalanced(u) == True):
        #   3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 
        u +=solution(v)
        return u
    # 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 
    else:
        # 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 
        temp = '('
        #  4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 
        v = solution(v)
        #   4-3. ')'를 다시 붙입니다. 
        temp += v + ')'

        #   4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
        for p in u[1:len(u) - 1]:
            if p == '(':
                temp += ')'
            else:
                temp += '('
                
        #   4-5. 생성된 문자열을 반환합니다.
        return temp


# print(solution("(()())()"))
# print(solution(")("))
print(solution("()))((()"))
profile
코딩하는 신방과생

0개의 댓글