스택 활용의 바이블같은 문제로, 스택을 활용하여 괄호가 잘 닫겼는지 검사하면 된다. 문장의 길이는 상관없고, 문장을 한 글자씩 검사하면서 열리는 괄호일 경우 스택에 삽입하고, 닫히는 괄호의 경우 스택의 끝을 검사해서 짝이 맞을 경우 그대로 pop해주면 된다. 그러니까, 닫히는 괄호가 들어왔는데 짝이 안 맞거나 스택이 비어있으면 (ex: [(])
, )
) 그 문장은 균형잡히지 못했다는 거다. 또는 문장을 끝까지 검사했는데 stack이 비어있지 않은 경우(ex: (((()))
)도 균형잡히지 못한 것이다. 그래서, 이런 로직을 코드에 잘 반영해주면 되겠다.
import sys
input = sys.stdin.readline
while True:
s = input()
stack = []
if s[0] == ".":
break
for c in s:
if c == "(" or c == "[":
stack.append(c)
elif c == ")":
if not stack or stack.pop() != "(":
stack.append(c)
elif c == "]":
if not stack or stack.pop() != "[":
stack.append(c)
if stack:
print("no")
else:
print("yes")