알고리즘/프로그래머스

[프로그래머스 | Lv2] 괄호 변환 (Python) - 2020 KAKAO BLIND RECRUITMENT

sssbin 2023. 3. 7. 13:43

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. 빈 문자열일 때 그대로 반환한다.

2. '('와 ')'가 같은 개수만큼 있으면 잘라서 u, v로 분리한다. (균형잡힌 괄호 문자열)

3. u를 복사한 리스트(tmp)를 생성해서 '()'를 빈 문자열로 교체해준다. 

4. u가 올바른 괄호 문자열(tmp == '')이면 v를 재귀적으로 수행한 후 u + 재귀결과 붙여서 반환한다.

5. u가 올바른 괄호 문자열이 아니면 v를 재귀적으로 수행한 후 '(' + 재귀결과 + ')' + u[1:-1] 거꾸로 붙여서 반환한다.

 

# 프로그래머스 60058: 괄호 변환 (2020 KAKAO BLIND RECRUITMENT)

def transfer(answer, p):
    left, right = 0, 0

    if p == '': # 빈 문자열 반환
        return p
    
    for i in range(len(p)):
        if p[i] == '(':
            left += 1
        else:
            right += 1
        
        if left == right: # 두 균형잡힌 괄호 문자열 u, v로 분리
            u = p[:i+1]
            v = p[i+1:]

            tmp = u[:]
            while '()' in tmp:
                tmp = tmp.replace('()', '')
            
            if tmp == '': # 올바른 괄호 문자열일 때
                answer += u + transfer(answer, v)
                return answer
            
            else: # 올바른 괄호 문자열이 아닐 때
                tmp = '' # u의 첫 번째, 마지막 문자 제거 후 나머지 문자열의 괄호 방향을 뒤집어서 붙인다.
                for j in u[1:-1]:
                    if j == '(':
                        tmp += ')'
                    else:
                        tmp += '('
                answer += '(' + transfer(answer, v) + ')' + tmp
                return answer

def solution(p):
    answer = ''
    return transfer(answer, p)