import sys
T = int(input())
for _ in range(T):
stack = []
input = list(sys.stdin.readline().rstrip())
isVPS = True
for ch in input:
if ch == '(':
stack.append(ch)
else:
# ch == ')'
if len(stack) == 0:
isVPS = False
break
else:
stack.pop()
if not stack and isVPS:
print('YES')
elif stack or not isVPS:
print('NO')
코드 설명
VPS가 되려면
(의 개수와)의 개수가 같아야 한다.
따라서 stack을 이용하여 두 괄호의 개수가 같은지 확인한다!
입력 문자열 한 줄을 받을 때마다 스택을 초기화해야하므로 stack = []을 for문 안에 위치시킨다. 또한 입력된 괄호 문자열이 VPS인지 확인하기 위해 사용할 boolean형 변수 isVPS를 선언하고 True값으로 초기화시킨다. 이 변수 역시 입력 문자열 한 줄을 맏을 때마다 초기화되어야 하므로 for문 안에 위치시킨다.
괄호 문자열에서 읽은 문자가 (이면 append() 함수를 사용하여 stack에 값을 넣는다.
문자가 )이면 두 가지 경우의 수가 생긴다.
이미 문자열의 크기가 0인 경우
(의 개수보다 )의 개수가 많음을 의미하므로 isVPS의 값을 False로 바꾸어준다. 그리고 break를 사용하여 해당 for문을 빠져나간다.
그렇지 않은 경우
pop() 함수를 사용하여 stack에서 값을 빼낸다.
괄호 문자열의 모든 문자를 검사하는 for문(안쪽 for문)을 완료하고 나면 해당 문자열이 VPS인지 아닌지 판별한다.
stack이 비어있고 isVPS == True 인 경우(의 개수보다 )의 개수가 같음을 의미하므로 YES를 출력한다.stack이 비어있지 않거나 isVPS == False 인 경우(의 개수와 )의 개수가 같지 않음을 의미하므로 NO를 출력한다.