✏ 풀이
from itertools import combinations
exp = list(input())
brk_idx = list() # 튜플(여는괄호idx, 닫는괄호idx)을 담는 리스트
left_brk_idx = list() # 여는 괄호를 잠시 저장해놓는 스택
result = list() # 결과 문자열을 리스트에 저장
for i in range(len(exp)):
if exp[i] == ')': # 닫는 괄호면
brk_idx.append((left_brk_idx.pop(), i))
elif exp[i] == '(': # 여는 괄호면
left_brk_idx.append(i)
for i in range(1, len(brk_idx)+1):
for x in combinations(brk_idx, i):
# print("x", x)
temp = exp[:] # 주의: temp = exp 라고 하면 reference가 넘어감
# 여기서 지워서 result에 저장
for l, r in x:
temp[l] = ''
temp[r] = ''
result.append(''.join(temp))
result = list(set(result)) # 괄호가 여러개 중첩돼있다면 ex) (((1)))(2) 조합을 돌려도 같은 결과가 나올 수 있음! 중복제거해주자
for x in sorted(result):
print(x)
✏ 풀이
import sys
input = sys.stdin.readline
def isVPS(str):
stack = list() # stack에는 여는 괄호 '('만 담는다.
for x in str:
if x == "(":
stack.append(x)
else: # 닫는 괄호 ')'를 만나면 stack에 있는 여는 괄호를 pop한다.
try:
stack.pop()
except:
return False
if not stack: # 스택이 비어있으면
return True
else:
return False
t = int(input())
for _ in range(t):
a = list(input().rstrip())
if isVPS(a):
print("YES")
else:
print("NO")
문자열이 VPS인지 확인하고 boolean값을 리턴하는 isVPS()함수를 작성했다.