괄호 제거(백준 2800번)
문제
어떤 수식이 주어졌을 때, 괄호를 제거해서 나올 수 있는 서로 다른 식의 개수를 계산하는 프로그램을 작성하시오.
이 수식은 괄호가 올바르게 쳐져 있다. 예를 들면, 1+2, (3+4), (3+4*(5+6))와 같은 식은 괄호가 서로 쌍이 맞으므로 올바른 식이다.
하지만, 1+(23, ((2+3)4 와 같은 식은 쌍이 맞지 않는 괄호가 있으므로 올바른 식이 아니다.
괄호를 제거할 때는, 항상 쌍이 되는 괄호끼리 제거해야 한다.
어떤 식을 여러 쌍의 괄호가 감쌀 수 있다.
나의 풀이(정답 참고)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from itertools import combinations
In=list(input())
stack=[]
bracket_list=[]
for i in range(len(In)):
if In[i]=='(':
stack.append(i)
elif In[i]==')':
bracket_list.append((stack.pop(),i))
exp_list=set()
for i in range(1,len(bracket_list)+1):
for c in combinations(bracket_list,i):
tmp=list(In)
for j in range(i):
tmp[c[j][0]]=''
tmp[c[j][1]]=''
exp_list.add(''.join(tmp))
exp_list=sorted(list(exp_list))
for exp in exp_list:
print(exp)
- 먼저 괄호의 위치를 파악하여, 쌍을 이루는 괄호의 index정보를 튜플형태로 list에 모두 저장한다.
- 그 후, 괄호 쌍들을 저장한
bracket_list
의 모든 조합을itertools
라이브러리의combinations
로 구한다.
주의) exp_list.add(''.join(tmp))
여기서 exp_list를 원래 list로 선언해서, append로 넣어주었는데, exp_list는 set()이어야 한다.
⇒ 만약 ((1+2))라는 식이 있을 때, 어떠한 괄호 쌍을 없애도 (1+2), (1+2)이기 때문
추가적인 문법
- from itertools import combinations
- 조합을 구해주는 라이브러리 함수
- set()은 중복되는 값이 없다.(집합 자료형이기 때문에 겹치는 값이 없음)
set.add()
로 값을 추가할 수 있다.set.update()
여러개의 값을 추가
1 2 3 4
>>> s1 = set([1, 2, 3]) >>> s1.update([4, 5, 6]) >>> s1 {1, 2, 3, 4, 5, 6}
set.remove()
특정값을 제거할 때 사용
1 2 3 4
>>> s1 = set([1, 2, 3]) >>> s1.remove(2) >>> s1 {1, 3}
- 교집합
1 2
>>> s1 & s2 {4, 5, 6}
- 합집합
1 2
>>> s1 | s2 {1, 2, 3, 4, 5, 6, 7, 8, 9}
- 차집합
1 2 3 4
>>> s1 - s2 {1, 2, 3} >>> s2 - s1 {8, 9, 7}
This post is licensed under CC BY 4.0 by the author.