코딩테스트/백준
백준(BAEKJOON) 2800 괄호제거 - Python
Moonsu99
2023. 12. 3. 21:38
https://www.acmicpc.net/problem/2800
2800번: 괄호 제거
첫째 줄에 음이 아닌 정수로 이루어진 수식이 주어진다. 이 수식은 괄호가 올바르게 쳐져있다. 숫자, '+', '*', '-', '/', '(', ')'로만 이루어져 있다. 수식의 길이는 최대 200이고, 괄호 쌍은 적어도 1개
www.acmicpc.net
풀이
from itertools import combinations
# 사용자 입력 받기
n = list(input()) # 사용자로부터 입력받은 수식을 문자열 리스트로 변환.
stack = [] # 괄호 쌍의 시작 인덱스를 판별
array = [] # 괄호 쌍의 인덱스를 저장.
answer = [] # 괄호를 제거한 후의 모든 가능한 식을 저장용도
# 괄호 쌍 위치 찾기
for i in range(len(n)):
if n[i] == '(': # 여는 괄호를 찾으면 스택에 인덱스를 추가
stack.append(i)
elif n[i] == ')': # 닫는 괄호를 찾으면 스택에서 가장 최근의 여는 괄호 인덱스를 꺼내고
s = stack.pop() # 여는 괄호와 닫는 괄호의 인덱스 쌍을 array에 추가.
array.append([s, i])
# 괄호 쌍을 제거하는 모든 조합 찾기
for i in range(1, len(array) + 1):
for combo in combinations(array, i): # array의 모든 가능한 조합을 생성
temp = n.copy() # 원본 수식의 복사본 생성
for a, b in combo: # 각 조합에서 괄호 쌍을 찾아
temp[a] = temp[b] = "" # 해당 괄호를 제거.
answer.append("".join(temp)) # 괄호가 제거된 식을 answer 배열에 추가.
# 중복 제거 및 정렬
answer = sorted(set(answer)) # 중복을 제거하고 사전 순으로 정렬.
print("\n".join(answer)) # 결과를 각각 별도의 줄에 출력.
combination을 몰라서 조금 헤맸다. 슬슬 어려워지네 문제들이..