[문제풀이]백준_2504_괄호의 값(스택_2, enumerate함수)

반응형

1. 문제 

etc-image-0
문제

2. 문제 해석

 - 어렵다.

 - 핵심은 열린 괄호가 들어올때 문제에 주어진 대로 곱하기를 해주고, 닫힌 괄호가 맞는 모양이면 pop과 동시에 이전것과 비교해 더하기를 해주어야 한다. 

 

3. enumerate함수

 1) 이 코드를 살려준 함수이다. 

 2) 리스트에 대해서 index값과 element를 함께 가져와 준다. 

 3) 잘 사용하면 반복문을 줄일 수 있을 것 같다. 

 

 4. 코드 

import sys
input = sys.stdin.readline

# stack에 넣는다.
stack = []
# 점수를 계산하는 sum 1로 시작
# 뒤에 열린 괄호가 들어오면서 곱샘을 해주기 때문에
sum = 1
# 괄호가 닫힐때 기존 괄호를 pop하면서 sum을 더해 주기 위한 변수
tmp = 0
# 괄호 데이터를 하나씩 받는다
st=input()
# 문자열의 인덱스 값과 요소를 함께 가져온다. 
for i,v in enumerate(st):
    if v == '(': # 반복문으로 가져온 요소가 열린 괄호일때
        if not stack: # stack에 아무것도 없다면
            stack.append(v) # 가져온 요소를 stack에 더한다.
            sum *= 2 # sum에 2를 곱한다. 
        elif stack[-1] == '(': # 비어있지 않아도 동일
            stack.append(v)
            sum *= 2
        elif stack[-1] == '[': # 열린 괄호가 있다면 동일
            stack.append(v)
            sum *= 2
    elif v == '[': # 위 '(' 와 동일
        if not stack:
            stack.append(v)
            sum *= 3
        elif stack[-1] == '(':
            stack.append(v)
            sum *= 3
        elif stack[-1] == '[':
            stack.append(v)
            sum *= 3
    elif v == ')': # 모양이 맞지 않는 괄호면 tmp를 0으로 만들고 break
        if len(stack) == 0 or stack[-1] == '[':
            tmp = 0
            break
        elif st[i-1] == '(': # 이전 인덱스의 요소와 모양이 맞다면 
            tmp += sum
        stack.pop()
        sum //= 2
        
    elif v == ']':
        if len(stack) == 0 or stack[-1] == '(':
            tmp = 0
            break
        elif st[i-1] == '[': # 이전 인덱스의 요소와 모양이 맞다면
            tmp += sum
        stack.pop()
        sum //= 3

if stack:
    print(0)
else:
    print(tmp)
반응형