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
를 출력한다.