Algorithm/백준 BOJ

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

은세라 2021. 9. 25. 03:20

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

 

2504번: 괄호의 값

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

www.acmicpc.net

1단계. Stack임을 알아챈다!

2단계. 괄호 별로 수행하는게 다르기 때문에 (, ), [, ] 각각 if로 분기친다 + 쌍이 안맞는 괄호 걸러내기

3단계. 계산이 복잡함을 깨닫고 새로운 flag역할을 할 tmp를 추가한다

4단계. 괄호 기호만 stack에 넣는게 아니라 계산 값도 동시에 stack으로 관리한다 

  - 계산 값만 따로 관리할 여러 방법을 생각해봤는데 괄호안에 괄호가 있는 거라 함께 관리해야 심플하다

5단계. 계산을 해야하는 상황에서, 2를 넣을지, 2를 곱할지, 이전까지 계산값과 더할지를 판단하여 계산한다

 

import sys
sys.stdin = open('input.txt', 'r')

str = list(input())
stack = []
tmp = 0
ans = 0

for s in str:
    if s=="(" or s=="[" : 
        stack.append(s)
    elif s==")": 
        tmp=0
        while(stack):
            top = stack.pop()
            if top=="(" :
                if tmp == 0: stack.append(2)
                else: stack.append(2*tmp)
                break
            elif top=="[":
                print(0)
                exit(0)
            else: 
                tmp = tmp + int(top)
    elif s=="]": 
        tmp=0
        while(stack):
            top = stack.pop()
            if top=="[" :
                if tmp == 0: stack.append(3)
                else: stack.append(3*tmp)
                break
            elif top=="(":
                print(0)
                exit(0)
            else: 
                tmp = tmp + int(top)

for i in stack:
    if i=="(" or i=="[":
        print(0)
        exit(0)
    else : 
        ans += i

print(ans)

 

그래도 3.5단계까지는 해본거 같아서 뿌듯하다.

같이 관리하는게 구현이 안돼서 괄호쌍이 만들어졌을 때 2, 3을 하나의 리스트로 빼는 것까지 했었는데

결국 stack에 같이 넣고 빼고 해야하는 거였다.

그래도 이정도 시행착오는 문제풀이가 익숙하지 않음에서 오는 거같아 한단계 성장한 기분이다!

 

예전 같았으면 으아악 뿌애앵!하고 패닉하기 바빳을텐데... 장하다 내자신!