저번 시간에 이어 스택을 활용한 문제를 풀어 보자.
이 문제는 괄호로만 주어진 문자열에서, 해당 문자열이 완전한 형태의 괄호 ()
로만 이루어진 '올바른 괄호 문자열(Valid Parenthesis String)'인지 아닌지를 판별하는 문제이다.
()
가 생길 때마다 없애야 하는 방식이다.True
를,False
를 반한하면 된다.import sys
# sys.stdin = open("input.txt", "r")
input = sys.stdin.readline
# 자료 구조 스택 구현
class Stack():
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
if self.empty():
raise Exception("stack is empty.")
self.items.pop()
def top(self):
if self.empty():
raise Exception("stack is empty.")
return self.items[-1]
def empty(self):
return not self.items
def __str__(self):
return str(self.items)
def __len__(self):
return len(self.items)
# T 입력
T = int(input())
# T만큼 반복
for _ in range(T):
# 스택 변수 할당
stack = Stack()
# 한 줄마다 문자열 입력
string = input()
# 문자열의 각 괄호를 검사
for parentheses in string:
# '('일 경우 스택에 추가
if parentheses == '(':
stack.push(parentheses)
# ')'일 경우 스택이 비어 있지 않으면 '(' 이 스택에 있으므로 스택의 '('를 제거
elif parentheses == ')':
if not stack.empty():
stack.pop()
# 스택이 비어 있으면 ')'가 먼저 오면 불완전하므로 "NO" 출력하고 for 문 탈출
else:
print("NO")
break
# 위의 for 문을 마친 이후 else 문을 실행
else:
# stack이 비어 있으면 완전하므로 "YES" 출력
if stack.empty():
print("YES")
# stack이 비어 있지 않으면 불완전하므로 "NO" 출력
else:
print("NO")