개발조아

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

알고리즘/백준

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

개발조아 2021. 8. 10. 16:18
728x90

문제 링크 : https://www.acmicpc.net/problem/2504

 

2504번: 괄호의 값

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

www.acmicpc.net

 

stack 응용 문제이다.

'(', '[' 여는 괄호가 나오면 스택에 넣고

')',']' 닫는 괄호가 나오면 값을 계산해서 스택에 넣는다.

스택의 탑에 올바른 짝이라면 그에 맞는 숫자 넣고

괄호가 아니라 숫자라면 괄호가 나올때까지 pop해서 더한 후에 괄호에 맞는 숫자를 더하고 다시 스택에 넣는다.

중간에 괄호가 안맞는게 온다면 0을 출력하고 끝낸다.

 

입력 1번

(()[[]])([]) 입력이 들어올 때 스택 상태

더보기

맨 오른쪽이 탑

(

( (

( ( ) <- 계산 후 ( 2

( 2 [

( 2 [ [ 

( 2 [ [ ] <- 계산 후 ( 2 [ 3

( 2 [ 3 ] <- 계산 후 ( 2 9

( 2 9 ) <- 계산 후 22

22 (

22 ( [

22 ( [ ] -> 계산 수 22 ( 3

22 ( 3 ) -> 계산 수 22 6

최종 22, 6 만 남고 스택 검사해서 괄호 남아있는지 체크 후 출력

 

 

최종적으로 마지막에 스택한번 검사하고 합을 구해서 출력한다.

 

from sys import stdin

input = stdin.readline

input_data = input().strip()

def solv():
    s = []
    for c in input_data:
        if c in '([':
            s.append(c)
        elif s:
            if c == ')':
                if s[-1] == '(':
                    s.pop()
                    s.append(2)
                elif s[-1] == '[':
                    print(0)
                    return
                else:
                    s.append(sum_num(s,'(',2))
            else:
                if s[-1] == '[':
                    s.pop()
                    s.append(3)
                elif s[-1] == '(':
                    print(0)
                    return
                else:
                    s.append(sum_num(s,'[',3))
        else:
            print(0)
            return

    answer = 0
    for c in s:
        if c in ['(',')','[',']']:
            print(0)
            return
        else:
            answer += c
    print(answer)
def sum_num(s,target,op):
    rst = 0
    while s and s[-1] not in ['(',')','[',']']:
        rst += s.pop()
    if s and s[-1] == target:
        s.pop()
        return rst*op
    else:
        return 0

solv()
Comments