본문 바로가기
Problem Solving

[백준 BOJ - 2504 / 파이썬] 괄호의 값

by Oh Seokjin 2022. 8. 1.

2504번: 괄호의 값 (acmicpc.net)

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

 

🔍 문제 분석

괄호가 올바르다면, 조건에 맞게 괄호에 값을 할당하여 계산하는 문제

 

❗ 해결 아이디어 

처음에는 괄호가 올바른지 검사하는 단계와 값을 계산하는 단계를 한번에 진행했었는데, 예외 처리 코드가 복잡해져서 과정을 직관적으로 따라가기 어려웠다.

따라서 괄호가 올바른지 검사하는 단계를 분리하여 과정을 단순화하였다. 이전 괄호의 프로세스를 따와서, 괄호가 올바른 경우에만 점수 계산 단계로 넘어가니 한결 수월하게 이해가 가능했다.

 

✔️ 최종 풀이

import sys

bracket_input = sys.stdin.readline().rstrip()

stack = []
is_ok = True

# 괄호 쌍이 맞는지 확인
for _ in range(len(bracket_input)):
    ps_list = []
    for bracket in bracket_input:
        ps_list.append(bracket)
        if ps_list[-2:] == ['(', ')'] or ps_list[-2:] == ['[', ']']:
            del ps_list[-2:]
    if ps_list:
        is_ok = False        

if is_ok:
    for bracket in bracket_input:
        if bracket == '(':
            stack.append(bracket)

        elif bracket == '[':
            stack.append(bracket)
        
        elif bracket == ')':
            if stack[-1] == '(':
                stack.pop()
                stack.append(2)
            elif type(stack[-1]) == int:
                temp = 0
                while type(stack[-1]) == int:
                    temp += stack[-1]
                    stack.pop()
                stack.pop()
                stack.append(temp*2)

        elif bracket == ']':
            if stack[-1] == '[':
                stack.pop()
                stack.append(3)
            elif type(stack[-1]) == int:
                temp = 0
                while type(stack[-1]) == int:
                    temp += stack[-1]
                    stack.pop()
                stack.pop()
                stack.append(temp*3)

if is_ok:
    print(sum(stack))
else:
    print(0)

댓글