백준2504(파이썬) - 괄호의 값
resilient
·2021. 6. 9. 13:08
728x90
반응형
https://www.acmicpc.net/problem/2504
- 괄호 특성상 짝이 맞아야하는데 순서가 상관없기 때문에 괄호문제가 나오면 거의 스택을 사용한 문제이다.
- 스택에 앞괄호( (,{,[ ) 를 넣어놓고 하나씩 pop() 함수를 이용해서 뒤에서 부터 꺼낸다음 '뒷괄호( ),},] ) 가 나오게 되면' 이라는 논리로 풀어야한다.
- 이 문제는 뒷괄호가 나와서 앞괄호와 짝을 이루게 되면 -> 숫자 계산이 이루어진다. 어렵게 생각하지말고 괄호가 모두 짝이 맞았을 때끼리 더해주고, 아니면 () 로 이루어지면 2, [] 로 이루어지면 3을 곱한다고 생각해 주면된다.
import sys
input = sys.stdin.readline
# \n를 빼주기 위해서 restrip() 을 사용
data = list(input().rstrip())
stack = []
for i in data:
if i ==')':
flag = 0
while len(stack)>0:
compare_pop = stack.pop()
if compare_pop == '(':
# 바로 옆에 ( 가 있을 때
if flag == 0:
stack.append(2)
else:
stack.append(2*flag)
# 짝을 한번 찾으면 break로 while문 빠져나가준다.
break
# 잘못된 괄호열
elif compare_pop == '[':
print(0)
# 인자값이 0이 들어가면 종료해준다.
exit(0)
#숫자면
else:
flag += compare_pop
elif i ==']':
flag = 0
while len(stack)>0:
compare_pop = stack.pop()
if compare_pop == '[':
# 바로 옆에 [ 가 있을 때
if flag == 0:
stack.append(3)
else:
stack.append(3*flag)
# 짝을 한번 찾으면 break로 while문 빠져나가준다.
break
# 잘못된 괄호열
elif compare_pop == '(':
print(0)
# 인자값이 0이 들어가면 종료해준다.
exit(0)
#숫자면
else:
flag += compare_pop
else:
stack.append(i)
result = 0
for i in stack:
# 아직도 괄호가 하나라도 남아 있으면 잘못된 괄호열
if i == '(' or i == '[':
print(0)
# 인자값이 0이 들어가면 종료해준다.
exit(0)
else:
result += i
print(result)
반응형
'자료구조 & 알고리즘 > 백준(Baekjoon)' 카테고리의 다른 글
백준1107(파이썬) - 리모컨 (0) | 2021.06.11 |
---|---|
백준1541(파이썬) - 잃어버린 괄호 (0) | 2021.06.10 |
백준2630(파이썬) - 색종이 만들기 (0) | 2021.06.08 |
백준1932(파이썬) - 정수 삼각형 (0) | 2021.06.07 |
백준6603(파이썬) - 로또 (0) | 2021.06.06 |