알고리즘 스터디

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

문제

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

 

2504번: 괄호의 값

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

www.acmicpc.net

 

 


풀이

 

스택으로 구현했다.

조건을 되는대로 추가하다보니 좀 길어졌다.

 

1. ( 나 [ 가 입력되면 스택에 추가한다.

2. ) 나 ] 가 입력되었을 때 스택이 비어있지 않다면 하나를 팝한다.

  2-1 팝한 값이 ( 나 [ 로 짝이 맞다면 숫자로 변환해 스택에 추가한다.

  2-2 팝한 값이 숫자라면 하나를 더 팝해서 짝이 맞는지 확인하고 숫자를 곱해 스택에 추가한다. 짝이

  2-3 그 밖의 값이 있다면 0출력, 종료한다.

3. 마지막 괄호까지 읽은 후에 스택에 값이 하나 초과이면 0출력, 종료

4. 스택에 하나 남은 값이 숫자가 아니라면 0출력 종료

 

틀렸었던 예외

1. ())) 처럼 닫는 괄호가 남을 때

2. (()(( 처럼 여는 괄호가 남았을 때

3. ( 처럼 괄호 하나만 입력되었을 때

 

import sys

str = input()

def afternum():
    global stack
    if len(stack) < 2:
        return
    if type(stack[-2]) is int:
        num = stack.pop()
        stack[-1] += num

stack = []
for s in str:
    if s == '(' or s == '[':
        stack.append(s)
    elif s == ')':
        if len(stack) <= 0:
            print(0)
            sys.exit(0)
        if stack[-1] == '(':
            stack.pop()
            stack.append(2)
            afternum()
        elif type(stack[-1]) is int:
            num = stack.pop()
            if len(stack) <= 0:
                print(0)
                sys.exit(0)
            if stack[-1] == '(':
                stack.pop()
                stack.append(num*2)
                afternum()
            else:
                print(0)
                sys.exit(0)
        else:
            print(0)
            sys.exit(0)
    elif s == ']':
        if len(stack) <= 0:
            print(0)
            sys.exit(0)
        if stack[-1] == '[':
            stack.pop()
            stack.append(3)
            afternum()
        elif type(stack[-1]) is int:
            num = stack.pop()
            if len(stack) <= 0:
                print(0)
                sys.exit(0)
            if stack[-1] == '[':
                stack.pop()
                stack.append(num*3)
                afternum()
            else:
                print(0)
                sys.exit(0)
        else:
            print(0)
            sys.exit(0)
if len(stack) != 1:
    print(0)
    sys.exit(0)
if type(stack[0]) is int:
    print(stack[0])
else:
    print(0)