Algorithm/programmers/2020 KAKAO BLIND RECRUITMENT/level2/ 괄호 변환(with python)

yellow·2021년 6월 18일
0

알고리즘 문제

목록 보기
46/58

📖 문제

2. 에서 끝에 잘린 부분: v는 빈 문자열이 될 수 있습니다.

📝 풀이 과정

  • 문제에서 주어진 "올바른 괄호 문자열"로 변환하는 과정을 차례대로 따라서 문제를 풀었다.
  • 함수 isRight은 문자열이 "올바른 괄호 문자열"인지 확인해주는 함수이다.
    -> stack을 활용해서 문자가 '('이면 push, ')'이면 pop
    문자열이 올바르지 않다면 stack이 비어있을 때 pop을 하는 경우가 생긴다.
  • 코드에 적혀있는 주석을 확인하면 어떤 흐름인지 알 수 있을 것입니다!

⌨ 코드

# 문자열이 '올바른 괄호 문자열'인지 확인
def isRight(s):
    stack = []
    for c in s:
        if c == '(':
            stack.append('(')
        elif c == ')':
            if not stack:
                return False
            else:
                stack.pop()       
    return True

# 문자열의 괄호 방향을 뒤집어서 리턴
def toggle(s):
    s = s.replace('(', 'tmp')
    s = s.replace(')', '(')
    s = s.replace('tmp', ')')
    return s

def solution(p):
    # 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환
    if not p:
        return ''

    # 2. 문자열 p를 두 "균형잡힌 괄호 문자열" u, v로 분리
    u = ''
    v = ''
    if len(p) == 2:
        u = p[:2]
    else:
        for i in range(2, len(p) + 1):
            u = p[:i]
            # 현재 u가 "균형잡힌 괄호 문자열"이라면
            if u.count('(') == u.count(')'):
                if i != len(p):
                    v = p[i:]
                # 처음으로 "균형잡힌 괄호 문자열"이 되었을 때 그 문자열이 u가 되도록 바로 for문 탈출
                break  

    # 3. 문자열 u가 "올바른 괄호 문자열"
    if isRight(u):
        # 3-1.
        answer = u + solution(v)
    # 4. 문자열 u가 "올바른 괄호 문자열"이 아닌 경우
    else:
        # 4-1 ~ 4-3
        new_v = '(' + solution(v) + ')'
        # 4-4
        u = toggle(u.replace(u,u[1:len(u)-1]))
        answer = new_v + u
    return answer
profile
할 수 있어! :)

0개의 댓글