์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑํŠธ๋ž˜ํ‚น

[๋ฐฑ์ค€ 2800 ๐Ÿฅ‡] ๊ด„ํ˜ธ ์ œ๊ฑฐ

1eehyunji 2023. 11. 30. 02:23

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๋กœ ์›์ƒ๋ณต๊ตฌํ•œ๋‹ค.
    • ์œ„ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ answer set์„ list๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  sorted ํ•จ์ˆ˜๋กœ ์‚ฌ์ „์ˆœ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.
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')