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

Junyoung Park·2021년 12월 30일
0

코딩테스트

목록 보기
31/631

1. 문제 설명

괄호 변환

2. 문제 분석

균형(즉 '(' / ')' 개수가 일치하는가) 및 올바른(즉 '(' 이후 ')' 매칭이 성공적인가) 형태의 괄호로 변환해 return하는 문제로, 재귀 함수를 사용하는 게 주요 관건이었다. solution(p)로 문제가 나와있는데, solution 함수 자체를 재귀로 사용하는지 새삼스레 다시 기억할 수 있었다. 괄호 변환이기 때문에 문자열 개수는 2개 단위로 체크하면 된다. 스택을 통해 올바른 괄호 형태인지 확인했고 이외 풀이는 문제에서 제시하는 구현 순서에 따라서 return 조건만 적절히 배치하면 된다. 코드를 제출하면서 가끔 런타임 에러/실패가 뜬 부분이 있었는데, 주요 관건은 u와 v를 나누는 조건에서 문자열을 두 칸씩 뛰어야 하는데 그러지 않았기 때문이었다.

3. 나의 풀이

def get_balanced(p):
    left_num = len([x for x in p if x == '('])
    right_num = len(p) - left_num
    if left_num == right_num:
        return True
    else:
        return False

def get_right(p):
    if not p: return False
    if p[0] != '(' or not get_balanced(p): return False

    stack = []
    for digit in p:
        if digit == '(':
            stack.append(digit)
        elif not stack:
            return False
        else:
            stack.pop(-1)
    if not stack:
        return True
    else:
        return False

def solution(p):
    if not p: return p
    if get_right(p): return p
    u = ''
    v = ''
    for i in range(2, len(p)+1, 2):
        if get_balanced(p[:i]) and get_balanced(p[i:]):
            u, v = p[:i], p[i:]
            break
    if get_right(u):
        return u + solution(v)
    else:
        result = '(' + solution(v) + ')'
        u = u[1:-1]
        for digit in u:
            if digit == '(':
                result += ')'
            else:
                result += '('
        return result
profile
JUST DO IT

0개의 댓글