본문 바로가기
Algorithm/프로그래머스

[프로그래머스] Lv2 - 괄호 변환 (파이썬)

by 2HS 2022. 4. 1.
def solution(p):
    # 1
    if p == '':
        return p
    # 2
    u, v = divide(p)
    # 3
    if check(u):
        return u + solution(v)
    # 4
    else:
        temp = '('+solution(v)+')'
        for x in u[1:-1]:
            if x == '(':
                temp += ')'
            else:
                temp += '('
        return temp


def divide(p):
    left, right = 0, 0
    for k in range(len(p)):
        if p[k] == '(':
            left += 1
        else:
            right += 1
        if left == right:
            return p[:k+1], p[k+1:]


def check(u):
    q = []
    for x in u:
        if not q:
            q.append(x)
        else:
            if x == ')' and q[-1] == '(':
                q.pop()
            else:
                q.append(x)
    if q:
        return False
    return True

 

2020 카카오 블라인드
1. 빈 문자열이면 리턴
2. divide : 왼쪽 괄호와 오른쪽 괄호의 수가 같아지는 지점으로 슬라이싱해서 반환 (u = 최초의 '균형 잡힌 괄호', v = 나머지)
3. check (스택을 이용해서 '올바른 괄호 문자열' 인지 아닌지 boolean값 반환)가 True라면
    - v를 가지고 다시 재귀적으로 판단
    - u와 위 결괏값을 합해서 반환
4. check가 False라면 (u가 올바른 괄호 문자열이 아니라면)
    - ( + v를 재귀로 돌린 반환 값 + ) 에서
    - u의 앞뒤 값을 제외한 값을 반전해서 더해주기
    - 결괏값 반환

 

문제를 읽다가 이해하 안 되는 부분이 있어서 잠깐 막혔었다. v를 재귀적 처리하라는 부분이었다.

풀다가 어디선가 오류가 나와서 결국 VSCode로 옮겨서 디버깅하고 정답처리가 됐다.