본문 바로가기
알고리즘 문제/프로그래머스_Lv2 도장깨기

[프로그래머스] 괄호 변환 (Python)

by 스코필 2024. 6. 16.

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

'(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 균형잡힌 괄호 문자열 이라고 부른다.

그리고 여기에 '(' 와 ')'의 괄호의 짝도 모두 맞을 경우에는 이를 올바른 괄호 문자열 이라고 부른다.

'(' 와 ')' 로만 이루어진 문자열 w가 균형잡힌 괄호 문자열이라면 다음과 같은 과정을 통해 올바른 괄호 문자열로 변환할 수 있다.

  1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
  2. 문자열 w를 두 균형잡힌 괄호 문자열 u, v로 분리합니다. 단, u는 균형잡힌 괄호 문자열로 더 이상 분리할 수 없으며, v는 빈 문자열이 될 수 있습니다.
  3. 문자열 u가 올바른 괄호 문자열이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
    1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
  4. 문자열 u가 올바른 괄호 문자열이 아니라면 아래 과정을 수행합니다.
    1. 빈 문자열에 첫 번째 문자로 '(' 를 붙입니다.
    2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
    3. ')' 를 다시 붙입니다.
    4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
    5. 생성된 문자열을 반환합니다.

매개변수 설명

  • p는 '(' 와 ')' 로만 이루어진 문자열이며 길이는 2 이상 1,000 이하인 짝수입니다.
  • 문자열 p를 이루는 '(' 와 ')'의 개수는 항상 같습니다.
  • 만약 p가 이미 올바른 괄호 문자열이라면 그대로 return 하면 됩니다.

 

✅ Code - 성공

# 균형잡힌 괄호 문자열 u, v를 분리하는 함수
def blance_bket(p):
    open_cnt = 0
    close_cnt = 0
    
    for i in range(len(p)):
        if p[i] == "(":
            open_cnt += 1
        else:
            close_cnt += 1
        if open_cnt == close_cnt:
            return p[:i + 1],  p[i + 1:]

# u가 올바른 문자열인지 확인하는 함수
def check_bket(u):
    stack = []
    for c in u:
        if c == "(":
            stack.append(c)
        else:
            if not stack:
                return False
            stack.pop()
    
    return True
            
def solution(p):
    if not p:
        return ""
    
    u, v = blance_bket(p)           # 2
    
    if check_bket(u):               # 3 ~ 3-1
        return u + solution(v)      
    else:
        answer = "("                # 4-1
        answer += solution(v)       # 4-2
        answer += ")"               # 4-3
        
        u = u[1: len(u) - 1]        # 4-4
        for c in u:                 # 4-5
            if c == "(":
                answer += ")"
            else:
                answer += "("
                        
    return answer