코테 대비 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))

 

토니님 풀이 참고하였음