스택을 통해 괄호쌍의 위치를 구할 수 있다. 각 괄호쌍을 놔둘지 없앨지 조합을 통해 카운트(모든 괄호를 건드리지 않는 조건은 제외)할 수 있다. 이를 통해 새로운 식을 만들어내어 사전식으로 정렬하자. 도출된 식이 중복 가능하므로 집합을 통해 체크.
import sys
from itertools import combinations
expression = list(sys.stdin.readline().rstrip())
brackets = []
stack = []
for i in range(len(expression)):
if expression[i] == "(":
stack.append(i)
elif expression[i] == ")":
brackets.append([stack.pop(), i])
answers = set()
for num in range(1, len(brackets)+1):
cases = list(combinations(brackets, num))
for case in cases:
new_expression = expression[:]
for x, y in case:
new_expression[x], new_expression[y] = '', ''
answers.add(''.join(new_expression))
answers = list(answers)
answers.sort()
print(*answers, sep='\n')