[Lv2] 괄호 변환

이말감·2022년 7월 26일
0

Programmers

목록 보기
19/32

프로그래머스 Lv2 괄호 변환

문제

링크

풀이

def solution(p):
    # 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
    if not p :
        return p
    # 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다.
    check = True
    num = 0
    for i in range(len(p)) :
        num += 1 if p[i] == '(' else -1
        if num < 0 :
            check = False
        if num == 0 :
            num = i+1
            break
    u, v = p[:num], p[num:]
    # 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
    if check :
        return u + solution(v)
    # 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 
    # 4-1, 4-2, 4-3
    sol = solution(v)
    answer = '()' if not sol else '(' + sol + ')'
    # 4-4, 4-5
    for letter in u[1:len(u)-1] :
        answer += '(' if letter == ')' else ')'
    return answer    

풀이는 문제에서 요구한 방법 그대로 사용했다.

  1. 빈 문자열이면 끝
  2. w를 균형잡힌 괄호 문자열로 분리하기
    2-1. 문자를 하나씩 비교하는데, 이때 '('는 +1, ')'는 -1을 더한다.
    2-2. 0이 될 경우 앞부분을 u, 뒷부분을 v로 나눌 수 있다.
    2-3. 이때 값이 0보다 작게 나온 적이 있다면 u는 "올바른 괄호 문자열"이 아니다.
  3. "올바른 괄호 문자열"일 경우 u는 그대로 두고 v를 다시 1번부터 실행하고, 그 값을 출력한다.
  4. "올바른 괄호 문자열"이 아닐 경우 v를 다시 1번부터 실행한다.
    4-1. v를 다시 실행한 값이 빈칸일 경우 answer에 '()' 를 넣어주고, 아닐 경우 값 양 옆에 괄호를 붙인다.
    4-2. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙인다.

위 방법대로 문제를 풀 수 있었다.

profile
전 척척학사지만 말하는 감자에요

0개의 댓글