반응형
문제 설명
괄호들의 균형이 잘 맞춰져 있는지 확인하는 문제이다.
괄호는 소괄호"()"와 대괄호"[]"가 있으며 다음과 같은 규칙이 있다.
- 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
- 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
- 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
- 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
- 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.
문제에서 문자열이 주어질 때, 그 문자열이 균형을 이루는 문장인지 확인하면 된다. 종료는 "."으로 한다.
풀이 과정
문자열을 처음부터 차례대로 검사하는데, 괄호가 등장하면 stack에 넣어준다.
1. 소괄호를 닫을 때 스택이 비어있거나, 스택의 top이 대괄호이면 잘못된 문장이다.
2. 대괄호를 닫을 때 스택이 비어있거나, 스택의 top이 소괄호이면 잘못된 문장이다.
3. 열린 괄호가 닫힌 괄호보다 많이 등장한다. ( 마지막에 stack이 비어있지 않을 때 )
이 세가지 경우를 제외하고는 짝을 맞춰 괄호가 등장한다.
import sys
while True:
sen = sys.stdin.readline().rstrip()
flag = 0
stack = []
if sen == '.':
break
for i in sen:
if i == "(" or i == "[": #열린 괄호면 스택에 넣어준다.
stack.append(i)
elif i == ")": #닫는 소괄호가 등장했을 때
if not stack or stack[-1] == "[": #열린 괄호가 없거나 열린 대괄호가 나오면
print("no")
flag = 1
break
else:
stack.pop()
elif i == "]": # 닫는 대괄호가 등장했을 때
if not stack or stack[-1] == "(": #열린 괄호가 없거나 열린 소괄호가 나오면
print("no")
flag = 1
break
else:
stack.pop()
if flag == 0: #앞서 no가 등장하지 않았을 때
if not stack : #스택이 비어있다 = 모든 괄호가 짝을 맞췄다
print("yes")
else:
print("no")
전체 문제 & 코드는 위의 깃에 정리되어 있습니다.
팔로우 & 맞팔은 환영입니다 !
반응형
'Algorithm > Stack & Queue' 카테고리의 다른 글
[백준] 17298번 오큰수 (Python 파이썬) (4) | 2021.04.15 |
---|---|
[백준] 1874번 스택 수열 (Python 파이썬) (4) | 2021.04.13 |
[백준] 9012번 괄호 (Python 파이썬) (0) | 2021.04.12 |
[백준] 10773번 제로 (Python 파이썬) (0) | 2021.04.12 |
[백준] 10828 스택 (Python 파이썬) (0) | 2021.04.12 |