# import sys
# input = sys.stdin.readline
while True:
inp = list(input())
a = 0
b = 0
p = True
if inp == ['.']:
break
before = []
for i in inp:
if i == '[':
b += 1
before.append('[')
elif before and before[-1] == '[' and i == ']':
b -= 1
before.pop()
elif (not before or before[-1] != '[') and i == ']':
p = False
break
elif i == '(':
a += 1
before.append('(')
elif before and before[-1] == '(' and i == ')':
a -= 1
before.pop()
elif (not before or before[-1] != '(') and i == ')':
p = False
break
if a < 0 or b < 0 :
p = False
break
if p and a == 0 and b == 0:
print('yes')
else:
print('no')
풀이
맨 위 두줄을 보면, sys 라이브러리로 입력을 한번에 받아오도록 했지만 이 문제에서는 그게 오히려 독이 됐다. (출력 초과가 발생했다.)
코드를 설명해보자면, a는 '('의 등장 수를, b는 '['의 등장 갯수를 확인한다. 그리고 before는 스택 구조인데, 활용한 이유는 '([)].' 이런 경우를 처리하기 위해서.. 단순히 a,b만 두고 구하면 위의 케이스에도 yes로 출력한다. 그래서 before 스택을 두고 ')'인 경우 before, a, b를 확인하도록 했다.
그리고 처음에는 p를 False로 변경하는 시점에 no를 출력하도록 하고 맨 아래 else를 두지 않았다. 근데 그렇게 하면... [][. 이런 경우엔 아무것도 출력하지 않는... 예외가 발생했다.
그래서 아예 p가 False가 되면 아무것도 출력하지 않고 break만 시킨 뒤에 맨 아래 else문을 두어 no이 무조건 1번만 출력되도록 했다.