괄호 변환 - 2020 KAKAO BLIND RECRUITMENT

KwonKusang·2021년 7월 15일
0
post-custom-banner

괄호 변환

문제 소개

"균형잡힌 괄호 문자열" p가 매개변수로 주어질 때, 주어진 알고리즘을 수행해 "올바른 괄호 문자열"로 변환한 결과를 return 하도록 solution 함수를 완성해 주세요.

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

설명이 길어 핵심과 헷갈렸던 부분만 짚어가며 시나리오를 써봤다.

괄호 문자열의 종류

  1. "균형잡힌 괄호 문자열" - 괄호가 온전히 열고 닫혔는지는 상관 없이 ()의 개수만 동일하면 됨.
  2. "올바른 괄호 문자열" - ()의 개수만 동일하고 모든 괄호가 온전히 열고 닫힘.

함수 구성

  1. 입력된 균형잡힌 관호 문자열(p)을 두 개의 균형잡힌 관호 문자열(u, v)로 분할하여 반환한다.
    • 문자열의 앞에서부터 ( , ) 의 개수를 각각 세어 동일해지면 분할
  2. 입력된 문자열이 "올바른 괄호 문자열"인지 판단하여 True, False 반환
    • 스택을 이용하여 문자를 하나씩 검토
    • 스택이 비어있거나 (이면 push
    • 문자가 )인데, 스택의 맨 위를 확인(peek)해서 (이면 pop
    • 모든 문자열을 검토한 후 스택이 비어있다면 True, 남아있다면 False
  3. 메인 함수

문제 풀이

# 변환 로직
def transform(p):
    if not p: return p
    u, v = dividing(p)
    
    if correcting(u):         
        return u + transform(v)
    
    s = "(" + transform(v) + ")"
    for i in u[1:len(u)-1]:
        if i == "(": s += ")"
        else: s += "("
         
    return s

# 균형 잡힌 두 개의 괄호 문자열로 분할
def dividing(s):
    left, right = 0, 0
    for i in range(len(s)):
        if s[i] == '(': left += 1
        else: right += 1
        if left == right:
            return s[:i+1], s[i+1:]

# 올바른 괄호 문자열인지 판단.
def correcting(s):
    stack = [s[0]]
    
    for i in s[1:]:
        if not stack or i == "(": stack.append(i)
        elif stack[-1] == ")": stack.append(i)
        else: stack.pop()
            
    if not stack: return True
    else: return False
    

def solution(p):
    return transform(p)

회고

문제의 난이도가 높지 않음에도 문제 해석에 많은 시간을 소비한 것이 아쉬웠다. 문제를 제대로 이해하지 못해 질문하시는 분들이 몇몇 계셨다.문제가 복잡할 땐 시나리오나 슈더코드를 작성해보며 설계하는 습관을 들이도록 하자😛

profile
안녕하세요! 백엔드 개발자 권구상입니다.
post-custom-banner

0개의 댓글