[๋ฐฑ์ค 2800 ๐ฅ] ๊ดํธ ์ ๊ฑฐ
https://www.acmicpc.net/problem/2800
2800๋ฒ: ๊ดํธ ์ ๊ฑฐ
์ฒซ์งธ ์ค์ ์์ด ์๋ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์์ด ์ฃผ์ด์ง๋ค. ์ด ์์์ ๊ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ณ์ ธ์๋ค. ์ซ์, '+', '*', '-', '/', '(', ')'๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค. ์์์ ๊ธธ์ด๋ ์ต๋ 200์ด๊ณ , ๊ดํธ ์์ ์ ์ด๋ 1๊ฐ
www.acmicpc.net
๋ฌธ์
์ด๋ค ์์์ด ์ฃผ์ด์ก์ ๋, ๊ดํธ๋ฅผ ์ ๊ฑฐํด์ ๋์ฌ ์ ์๋ ์๋ก ๋ค๋ฅธ ์์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ด ์์์ ๊ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ณ์ ธ ์๋ค. ์๋ฅผ ๋ค๋ฉด, 1+2, (3+4), (3+4*(5+6))์ ๊ฐ์ ์์ ๊ดํธ๊ฐ ์๋ก ์์ด ๋ง์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅธ ์์ด๋ค.
ํ์ง๋ง, 1+(2*3, ((2+3)*4 ์ ๊ฐ์ ์์ ์์ด ๋ง์ง ์๋ ๊ดํธ๊ฐ ์์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅธ ์์ด ์๋๋ค.
๊ดํธ๋ฅผ ์ ๊ฑฐํ ๋๋, ํญ์ ์์ด ๋๋ ๊ดํธ๋ผ๋ฆฌ ์ ๊ฑฐํด์ผ ํ๋ค.
์๋ฅผ๋ค์ด (2+(2*2)+2)์์ ๊ดํธ๋ฅผ ์ ๊ฑฐํ๋ฉด, (2+2*2+2), 2+(2*2)+2, 2+2*2+2๋ฅผ ๋ง๋ค ์ ์๋ค. ํ์ง๋ง, (2+2*2)+2์ 2+(2*2+2)๋ ๋ง๋ค ์ ์๋ค. ๊ทธ ์ด์ ๋ ์์ด ๋์ง ์๋ ๊ดํธ๋ฅผ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ค ์์ ์ฌ๋ฌ ์์ ๊ดํธ๊ฐ ๊ฐ์ ์ ์๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด ์๋ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์์ด ์ฃผ์ด์ง๋ค. ์ด ์์์ ๊ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ณ์ ธ์๋ค. ์ซ์, '+', '*', '-', '/', '(', ')'๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค. ์์์ ๊ธธ์ด๋ ์ต๋ 200์ด๊ณ , ๊ดํธ ์์ ์ ์ด๋ 1๊ฐ, ๋ง์์ผ 10๊ฐ์ด๋ค.
์ถ๋ ฅ
์ฌ๋ฐ๋ฅธ ๊ดํธ ์์ ์ ๊ฑฐํด์ ๋์ฌ ์ ์๋ ์๋ก ๋ค๋ฅธ ์์ ์ฌ์ ์์ผ๋ก ์ถ๋ ฅํ๋ค.

๋ฌธ์ ํ์ด
- ๋จผ์ stack์ ์ด์ฉํด์ ์ฌ๋ ๊ดํธ '('๋ฅผ ๋ง๋๋ฉด stack์ ํด๋น ์ธ๋ฑ์ค๋ฅผ appendํ๊ณ , ๋ซ๋ ๊ดํธ ')'๋ฅผ ๋ง๋๋ฉด ๋งจ ์์ ์๋(์ฆ, ๊ฐ์ฅ ์ต๊ทผ์ ์ด๋ฆฐ ๊ดํธ) ๊ดํธ์ ์ธ๋ฑ์ค๋ฅผ popํด์ ๋ซ๋ ๊ดํธ์ผ ์ธ๋ฑ์ค์ ํจ๊ป bracket ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ์ด ๊ณผ์ ์ ํตํด์ ์ฌ๋ฐ๋ฅธ ๊ดํธ ์์ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ ์ ์๋ค.
- ์ด๋ ๊ฒ ๊ตฌํ ์ฌ๋ฐ๋ฅธ ๊ดํธ ์์ ๊ฐ๊ฐ์ ๋ํด์ ์ญ์ ํ๋ ๊ฒฝ์ฐ์ ์ญ์ ํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฑํธ๋ํน์ ์ด์ฉํด์ ํ์ํ๋ค.
- backtrackging_eggs ํจ์๋ฅผ ์ด์ฉํด์ ํ์ฌ ์ญ์ ํ ๊ดํธ์ ๋ฒํธ n๊ณผ ์ด๋ฏธ ์ญ์ ํ ๊ดํธ์ ๊ฐ์ cnt๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ด์ ์ฌ๊ท์ ์ผ๋ก ํ์ํ๋ค.
- ์ญ์ ํ ๊ดํธ์ ๋ฒํธ๊ฐ ์์์ ๊ตฌํ ์ฌ๋ฐ๋ฅธ ๊ดํธ ์์ ๊ฐ์์ ๊ฐ๋ค๋ฉด ๋ชจ๋ ๊ดํธ๋ฅผ ํ์ํ ๊ฒ์ด๋ฏ๋ก ์ด๋ ์ญ์ ํ ๊ดํธ์ ๊ฐ์ cnt๊ฐ 0๋ณด๋ค ํฌ๋ค๋ฉด ๊ดํธ์ ์ญ์ ์ฌ๋ถ๋ฅผ ์ ์ฅํ arr_visited ๋ฐฐ์ด์ ๋๋ฉด์ ๊ดํธ๋ฅผ ์ญ์ ํ ๋ฌธ์์ด์ answer set์ ์ถ๊ฐํ๋ค.
- ํ์ ๊ณผ์ ์์ ์ค๋ณต๋๋ ๋ฌธ์์ด์ด ์กด์ฌํ ์ ์์ผ๋ฏ๋ก ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด set ์๋ฃํ์ ์ฌ์ฉํ๋ค.
- ์์ง ์ฌ๋ฐ๋ฅธ ๊ดํธ ์์ ๋ชจ๋ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ค์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด์ ํ์ํ๋ค.
- n๋ฒ ๊ดํธ๋ฅผ ์ญ์ ํ์ง ์๊ณ ๋ค์ ๊ดํธ๋ก ๋์ด๊ฐ๋ ๊ฒฝ์ฐ
- cnt๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ๊ดํธ์ ์ธ๋ฑ์ค๋ฅผ ๋งค๊ฐ๋ณ์ n์ผ๋ก ๋๊ธด๋ค.
- n๋ฒ ๊ดํธ๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ
- bracket[n][0], bracket[n][1] ๋ฒ ์ธ๋ฑ์ค๋ฅผ arr_visited ๋ฐฐ์ด์์ False๋ก ํ์ํ๋ค.
- cnt๋ฅผ ์ถ๊ฐํ๊ณ ๋ค์ ๊ดํธ๋ฅผ ํ์ํ๋ค.
- ๋ค์ ๊ดํธ ํ์์ด ๋๋๋ฉด False๋ก ํ์ํด๋๋ ๊ดํธ์ ์ธ๋ฑ์ค๋ค์ ๋ค์ True๋ก ์์๋ณต๊ตฌํ๋ค.
- n๋ฒ ๊ดํธ๋ฅผ ์ญ์ ํ์ง ์๊ณ ๋ค์ ๊ดํธ๋ก ๋์ด๊ฐ๋ ๊ฒฝ์ฐ
- ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ answer set์ list๋ก ๋ณํํ๊ณ sorted ํจ์๋ก ์ฌ์ ์ ์ ๋ ฌํด์ ์ถ๋ ฅํ๋ค.
- ์ญ์ ํ ๊ดํธ์ ๋ฒํธ๊ฐ ์์์ ๊ตฌํ ์ฌ๋ฐ๋ฅธ ๊ดํธ ์์ ๊ฐ์์ ๊ฐ๋ค๋ฉด ๋ชจ๋ ๊ดํธ๋ฅผ ํ์ํ ๊ฒ์ด๋ฏ๋ก ์ด๋ ์ญ์ ํ ๊ดํธ์ ๊ฐ์ cnt๊ฐ 0๋ณด๋ค ํฌ๋ค๋ฉด ๊ดํธ์ ์ญ์ ์ฌ๋ถ๋ฅผ ์ ์ฅํ arr_visited ๋ฐฐ์ด์ ๋๋ฉด์ ๊ดํธ๋ฅผ ์ญ์ ํ ๋ฌธ์์ด์ answer set์ ์ถ๊ฐํ๋ค.
import sys
arr=list(sys.stdin.readline().strip())
answer=set()
bracket=[]
stack=[]
# ๊ดํธ ์ ๊ตฌํ๊ธฐ
for idx in range(len(arr)):
if arr[idx]=='(':
stack.append(idx)
elif arr[idx]==')':
open=stack.pop()
bracket.append((open, idx))
visited=[False]*len(bracket)
arr_visited=[True]*len(arr)
# ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ์
# n์ ํ์ฌ ์ญ์ ํ ๊ดํธ ๋ฒํธ
# cnt๋ ์ญ์ ๋ ๊ดํธ์ ๊ฐ์
def backtracking(n,cnt):
# ์ญ์ ๋ ๊ดํธ์ ๊ฐ์๊ฐ 0๊ฐ ์ด์์ด๋ผ๋ฉด answer์ ๋ต ์ถ๊ฐ
if n==len(bracket):
if cnt>0:
# arr_visited๋ฅผ ์ด์ฉํ ๋ต ์ถ๊ฐ
tmp = ''
for i in range(len(arr_visited)):
if arr_visited[i]:
tmp += arr[i]
answer.add(tmp)
return
# ํด๋น ๊ดํธ ์ญ์ ์ํ๋ ๊ฒฝ์ฐ
backtracking(n+1, cnt)
# ํด๋น ๊ดํธ ์ญ์ ํ๋ ๊ฒฝ์ฐ
arr_visited[bracket[n][0]]=False
arr_visited[bracket[n][1]]=False
backtracking(n+1, cnt+1)
arr_visited[bracket[n][0]]=True
arr_visited[bracket[n][1]]=True
backtracking(0,0)
print(*sorted(list(answer)), sep='\n')