백준

백준 2504 괄호의 값 (파이썬)

MC류짱 2022. 12. 13. 19:45

풀이 및 해설(주석)

import sys

# 먼저 괄호의 짝이 제대로 맞는지 확인부터 하는 함수
# main함수에서 확인 할 수 있지만 그렇게 하면 코드가 너무 복잡하고 지저분해짐
def is_right():
    stack = []
    for s in st:
        if s == '(' or s == '[':
            stack.append(s)
        elif s == ')':
            if not stack:
                return False
            elif stack[-1] == '(':
                stack.pop()
            else:
                return False
        elif s == ']':
            if not stack:
                return False
            elif stack[-1] == '[':
                stack.pop()
            else:
                return False
    if stack:
        return False
    else:
        return True


def main():
    S = []
    for s in st:
        # 여는 괄호면 일단 무조건 append
        if s == '(' or s == '[':
            S.append(s)
        # 닫는 괄호가 나오고 스택의 탑이 같은 타입의 여는 괄호면 일단 2, 3을 넣어줌
        elif s == ')':
            if S[-1] == '(':
                S.pop()
                S.append(2)
            # 스택의 탑이 숫자면, 괄호의 값을 구해줘야함 괄호의 짝이 무조건 맞기 때문에
            # 여는 괄호가 나올때 까지 == 스택의 탑이 숫자일 때 까지 tmp에 더해주고
            # 2 또는 3을 곱하여 괄호의 값을 구해줌
            else:
                tmp = 0
                while type(S[-1]) == int:
                    tmp += S.pop()
                S.pop()
                S.append(tmp*2)

        elif s == ']':
            if S[-1] == '[':
                S.pop()
                S.append(3)
            else:
                tmp = 0
                while type(S[-1]) == int:
                    tmp += S.pop()
                S.pop()
                S.append(tmp * 3)

    return sum(S)


if __name__ == '__main__':
    st = sys.stdin.readline().strip()

    if is_right():
        print(main())
    else:
        print(0)