본문 바로가기
알고리즘/프로그래머스

[파이썬][프로그래머스] Lv. 2 괄호 변환

by SBOX Learning by doing 2022. 7. 9.
반응형

def solution(p):

    answer = process(p)
    return answer

def process(p):
    answer = ''
    # 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
    if p == '':
        return answer
    # 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다.
    u, v = splitUV(p)
    # 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
    if isCorrectStr(u):
        # 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 
        answer += u + process(v)
    # 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
    else:
        # 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
        strString = "("
        # 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
        strString += process(v)
        # 4-3. ')'를 다시 붙입니다. 
        strString += ")"
        # 4-4. u의 첫 번째와 마지막 문자를 제거하고
        strString += reverseStr(u[1:-1])
        return strString
        
    return answer
def reverseStr(str):
    # 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 
    answer = ""
    if len(str) > 0:
        for i in str:
            if i == "(":
                answer += ")"
            else:
                answer += "("
    return answer
    

def isCorrectStr(str):
    count = 0
    for i in str:
        if i == "(":
            count += 1
        else:
            count -= 1
        if count < 0:
           return False
    return count == 0
def splitUV(str):
    u = str
    v = ''
    for i in range(2, len(str), 2):
        if isBalancedString(str[:i]):
            u = str[:i]
            v = str[i:]
            break
    return u, v

def isBalancedString(str):
    return str.count("(") == str.count(")")

반응형

댓글