조건은 아래와 같다.
1. 왼쪽 소괄호('(')는 오른쪽 소괄호(')')와 짝을 맺는다
2. 왼쪽 대괄호('[')는 오른쪽 대괄호(']')와 짝을 맺는다.
3. 괄호 하나는 한 개의 반대 괄호와만 짝을 맺는다.
4. 왼쪽 괄호가 나왔다면 반드시 오른쪽 괄호도 나와야 한다.
이런 문자열일 경우 yes를, 아닐 경우 No를 출력한다.
딱 봐도 Stack을 사용하면 빨리 풀 수 있는 문제라고 생각했다.
왼쪽 괄호가 나오면 Stack에 넣고, 오른쪽 괄호가 나오면 Stack의 가장 상단에 존재하는 값을 pop하여 매칭되는 왼쪽 괄호인지 확인하면 될 것 같았다.
즉, stack에 (가 출력된다면 오른쪽 괄호는 )이여지만 균형잡힌 문자열인 것이다
import re
while True :
N = input()
stack = []
if N == "." :
break
# while문 종료 조건
N = re.sub('[a-zA-Z \\.]', '',N).strip()
# a~z, A~Z, '.'을 문자열에서 제거(균형잡힌 문자열에서 확인할 필요가 없음)
for i in N :
if i == '[' or i == '(' :
stack.append(i)
elif i == ']' :
if len(stack) != 0 and stack[-1] == '[' :
stack.pop()
# 맞으면 지워서 stack을 비워줌 0 = yes
else :
stack.append(']')
break
elif i == ')' :
if len(stack) != 0 and stack[-1] == '(' :
stack.pop()
else :
stack.append(')')
break
# stack이 비었기 때문에(좌측 괄호가 존재하지 않았기 때문에)
# 균형잡힌 문자열이 안 될 수도 있다.
# 따라서, stack.append('아무 문자열') 명령어를 추가해준다.
# 이렇게 하면 stack이 비었을 경우 균형잡힌 문자열, 비지 않았다며
# 균형잡히지 않은 문자열이라고 판단 가능하다
if len(stack) == 0 :
print('yes')
else :
print('no')