코테 대비 python/백준
2800 스택 ==> 다시풀어보기
ylab
2023. 2. 2. 23:41
https://www.acmicpc.net/problem/2800
2800번: 괄호 제거
첫째 줄에 음이 아닌 정수로 이루어진 수식이 주어진다. 이 수식은 괄호가 올바르게 쳐져있다. 숫자, '+', '*', '-', '/', '(', ')'로만 이루어져 있다. 수식의 길이는 최대 200이고, 괄호 쌍은 적어도 1개
www.acmicpc.net
#쌍이 되는 괄호를 제거 한다
#사전 순으로 출력한다? 어떤 의미??
import sys
def input():
return sys.stdin.readline().rstrip()
s = input()
N = len(s)
index = [ -1 for _ in range(N) ]
stack = []
current_index = 0
# 올바른 괄호만 주어진다. 각 괄호 쌍에 차례대로 index를 붙여주고 기록하자.
for idx, ch in enumerate(s):
if ch == '(':
stack.append(current_index)
index[idx] = current_index
current_index += 1
elif ch == ')':
index[idx] = stack.pop()
# 각 괄호에 번호를 기록해놨다. 이제 재귀를 돌아 괄호쌍을 뽑자.
answer = [] # 가능한 모든 것을 저장 후 정렬 후 출력하기 위해 사용
# current_index ==> bracket count
choose = [ 0 for _ in range(current_index) ]
# cnt -> bracket index 번호
def func(cnt):
if cnt == current_index:
erase_bracket_count = sum(choose)
if erase_bracket_count == 0:
return
string = ""
for idx, ch in enumerate(s):
# index[idx] == -1 인 경우 (괄호가 아니므로 추가)
# 만약 -1이면 뒤에 조건문이 실행 안됨
if index[idx] == -1 or choose[index[idx]] == 0:
string += ch
answer.append(string)
return
choose[cnt] = 1 # 해당 괄호쌍을 지운 경우
func(cnt + 1)
choose[cnt] = 0 # 해당 괄호쌍을 지우지 않은 경우
func(cnt + 1)
# Run
func(0)
# 정답 중에 중복이 있을 수 있기 때문에 중복 제거
answer = sorted(set(answer))
print('\n'.join(answer))
토니님 풀이 참고하였음