[Python][백준] 2504번 괄호의 값

신남·2023년 1월 18일

https://www.acmicpc.net/problem/2504

공부 날짜 : 2023.01.08
정답 참조 여부 : O

괄호로 이루어진 문자열이 주어지고 문제의 조건에 맞게 괄호를 수식으로 바꿨을 때 수식 결과 값을 출력하거나, 괄호쌍에 문제가 있으면 0을 출력하는 문제이다.


자료 구조의 개념도 필요하지만 수식을 계산할 수 있는 절차를 살짝 바꿔서 바라봐야 했다.
항상 수식은 중위 표기식으로만 생각해서 표기식을 좀 바꾸니 문제를 풀기 많이 어려웠다.

기본적으로 스택을 사용해서 괄호쌍을 체크는 해줄 수 있지만, 수식계산이 많이 어려워서 정답을 참고 했다.

정답에서는 괄호가 열리면 괄호 형태에 맞게 곱해주고 괄호가 닫히면 괄호의 값을 나눠주는 식으로 값을 저장했다.

그러던중 괄호가 쌍을 이뤄서 열리고 닫혔을 때 결과에 더해주는 식으로 해결했다.

수식을 순차적으로 보고 풀 수 있어야 할거 같다.

소스코드

import sys
input = sys.stdin.readline
##########################################
input_data = input().rstrip()

stack = []
temp = 1
result = 0

# 인덱스 접근
for i in range(len(input_data)):
    # 괄호가 열리면 숫자만큼 곱해주고 스택에 추가
    if input_data[i] == "(":
        temp *= 2
        stack.append("(")

    elif input_data[i] == "[":
        temp *= 3
        stack.append("[")

    # 괄호가 닫힐 때
    elif input_data[i] == ")":
        # 스택의 마지막이 다른 괄호면 틀림
        if len(stack) == 0 or stack[-1] == "[":
            result = 0
            break

        # 단일 괄호로 숫자이면 결과에 더하기
        if input_data[i-1] == "(":
            result += temp

        # 쌍에 이상없는 괄호면 나눠주기
        temp //= 2
        stack.pop(-1)

    # 괄호가 닫힐 때
    elif input_data[i] == "]":
        # 스택의 마지막이 다른 괄호면 틀림
        if len(stack) == 0 or stack[-1] == "(":
            result = 0
            break

        # 단일 괄호로 숫자이면 결과에 더하기
        if input_data[i - 1] == "[":
            result += temp

        # 쌍에 이상없는 괄호면 나눠주기
        temp //= 3
        stack.pop(-1)

if len(stack) != 0:
    result = 0

print(result)

0개의 댓글