(3주차) 2800: 괄호 제거

Untitled

풀이

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)

(3주차) 9012: 괄호

Untitled

풀이

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()함수를 작성했다.