문제
https://www.acmicpc.net/problem/2504
풀이
스택으로 구현했다.
조건을 되는대로 추가하다보니 좀 길어졌다.
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)
'알고리즘 스터디' 카테고리의 다른 글
[백준] 1062 가르침 파이썬 (0) | 2021.10.30 |
---|---|
[백준] 14719 빗물 파이썬 (0) | 2021.10.30 |
[백준] 14888 연산자 끼워넣기 파이썬 (0) | 2021.10.29 |
[백준] 14891 톱니바퀴 파이썬 (0) | 2021.10.03 |
[백준] 1918 후위표기식 파이썬 (0) | 2021.10.03 |