-
2800 스택 ==> 다시풀어보기코테 대비 python/백준 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))
토니님 풀이 참고하였음
'코테 대비 python > 백준' 카테고리의 다른 글
2231 분해합 (0) 2023.02.03 1874 스택==> 다시풀기 (0) 2023.02.03 2346 덱 rotate (0) 2023.02.02 10872 재귀 (0) 2023.02.02 15651 N과 M (0) 2023.01.31