def vps(p):
stack = []
check = True
for i in p:
if i == "(" or i == "[":
stack.append(i)
elif i == ")" or i == "]":
if i == ")":
if not stack or stack[-1] == "[" : # ")", "]" 로 먼저 시작되는 경우 no
check = False
break
else:
stack.pop()
elif i == "]":
if not stack or stack[-1] == "(":
check = False
break
else:
stack.pop()
if not stack and check == True:
print("yes")
else:
print("no")
while True:
p = input()
if (p == '.'):
break
vps(p)
코드설명
기본적인 방식은 이전의 9012번 문제 풀이와 유사하다. 하지만 여러 가지 경우의 수를 체크해 주어야 한다.
먼저, 반복문을 돌면서 입력되는 값이 . 일 경우 반복문을 탈출한다.
vps 함수에서는 문장을 탐색하면서 값이 "(" 나 "[" 로 시작하는 경우에는 스택에 삽입하여준다.
그렇지 않고 ")", "]" 와 같은 경우일 때는 2가지 경우로 나누어 생각한다.
1) ")" 이 오는 경우 - 스택에 값이 존재하지 않음 혹은 "["로 시작되어 있는 경우 ")" 로 닫힐 수 없으므로 check = False 로 할당
2) "]" 이 오는 경우 - 스택에 값이 존재하지 않음 혹은 "("로 시작되어 있는 경우 "]" 로 닫힐 수 없으므로 check = False 로 할당
위의 경우가 아니라면 정상적인 경우이므로 스택에서 값을 지워준다.
마지막으로, 스택에 값이 없고 check = True 인 경우에만 "yes" 를 출력하고 그 외엔 "no" 를 출력한다.
Point : 이전 문제와 유사하지만 대괄호가 추가되면서 체크해야 할 조건이 늘어났다.
예를 들어 "[" 가 온 경우 ")"가 닫힐 수 없고, "("가 온 경우 "]"가 닫힐 수 없는 경우와 같다.
위와 같은 조건들에서는 체크 항목을 False 로 할당 후 "no"를 출력하면 된다.
728x90
'SW개발 > 코딩테스트' 카테고리의 다른 글
[백준]18258번 큐 2 - 큐 (0) | 2021.01.15 |
---|---|
[백준]1874번 스택 수열 - 스택 (0) | 2021.01.14 |
[백준]9012번 괄호 - 스택 (0) | 2021.01.12 |
[백준]10773번 제로 - 스택 (0) | 2021.01.11 |
[백준]10828번 스택 - 스택 (0) | 2021.01.02 |