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

Sujin Lee·2022년 11월 28일
0

코딩테스트

목록 보기
168/172
post-thumbnail

문제

프로그래머스 - 괄호 변환

해결 과정

  1. check함수
  • 올바른 괄호 문자열인지 확인하는 함수
  • 문자열에 대해 하나씩 확인하면서
    • 열린 괄호라면 스택에 넣고
    • 닫힌 괄호라면
      스택이 비워져있다면 바로 false 반환 = 닫힌 괄호와 맞는 게 없는 것
      가장 마지막에 넣은 게 열린 괄호일테니까 pop으로 제거
  1. divide함수
  • 문자열을 u,v로 분리하는 함수, 균형잡힌 (열린 괄호, 닫힌 괄호 개수가 같게) 문자열로 분리
  • 열린 괄호와 닫힌 괄호의 개수를 세는 변수 만들기
  • 문자열을 하나씩 확인하면서
    열린 괄호와 닫힌 괄호의 개수를 세다가
    둘의 개수가 같아지면 문자열에 대해서 균형잡힌 문자열과 아닌 문자열을 반환
  1. solution함수
    1) 입력이 빈 문자열인 경우 빈문자열 반환
    2) 문자열을 u,v로 분리
    3) u가 올바른 괄호 문자열이라면 v를 다시 solution함수 수행
    • 수행한 결과를 u에 이어붙이기
      4) u가 올바른 괄호 문자열이 아니라면
    • 빈 문자열 answer에 '('를 붙이고
    • v에 대해 다시 solution함수 수행헌 결과를 answer에 이어붙이기
    • 다시 answer에 ')'를 붙이기
    • u의 첫번째 문자와 마지막 문자를 제거하고, 그 문자열의 괄호를 반대로 뒤집어서 answer에 붙이기

풀이

# 올바른 괄호 문자열인지 확인하는 함수
def check(c):
    stack = []
    for i in c:
        if i == '(':
            stack.append(i)
        else:
            if not stack:
                return False
            stack.pop()
    return True
# 문자열 p를 u, v로 분리하는 함수
def divide(p):
    open_p = 0
    close_p = 0
    for i in range(len(p)):
        if p[i] == '(':
            open_p += 1
        else:
            close_p += 1
        if open_p == close_p:
            return p[:i+1], p[i+1:]
            
def solution(p):
    # 1
    if not p:
        return ''
    
    # 2
    u,v = divide(p)
    
    # 3
    if check(u):
        return u + solution(v)
    # 4
    else:
        answer = '('
        answer += solution(v)
        answer += ')'
        
        for i in u[1:len(u)-1]:
            if i == '(':
                answer += ')'
            else:
                answer += '('
        return answer
profile
공부한 내용을 기록하는 공간입니다. 📝

0개의 댓글