ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

2800๋ฒˆ: ๊ด„ํ˜ธ ์ œ๊ฑฐ

์ฒซ์งธ ์ค„์— ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์‹์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜์‹์€ ๊ด„ํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ณ์ ธ์žˆ๋‹ค. ์ˆซ์ž, '+', '*', '-', '/', '(', ')'๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ˆ˜์‹์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ 200์ด๊ณ , ๊ด„ํ˜ธ ์Œ์€ ์ ์–ด๋„ 1๊ฐœ

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๊ด„ํ˜ธ๊ฐ€ ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ชจ๋‘๋ฅผ ์ฒดํฌํ•˜์—ฌ์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ๋ฅผ ์ด๋ฃจ๋Š” ๊ฒฝ์šฐ๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์ด์— ๋”ฐ๋ผ `DFS`๋ฅผ ํ†ตํ•ด ๊ฐ€์ง€๋ฅผ ๋ป—์–ด๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค. 

 

  • `DFS`์—์„œ ์–ด๋–ค ๊ฒฝ์šฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋ฏธ๋ฆฌ ์ฒดํฌ๋ฅผ ํ•œ๋‹ค.
    • ์ด๋Š” `stack`์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง์—์„œ, ์–ด๋–ค ๊ฒฝ์šฐ ์ธ์ง€ ๊ธฐ๋กํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.
  • `DFS`๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ง€์น˜๊ธฐ ํ•œ๋‹ค.
    • ๊ด„ํ˜ธ๋ฅผ ์ง€์šฐ๋Š” ๊ฒฝ์šฐ์™€ ์ง€์šฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰œ๋‹ค.
    • ๋‹ต์ด ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌ์„ฑํ•  ๋•Œ ๋ฐฑ ํŠธ๋ž™ํ‚น์ด ๊ฐ€๋Šฅํ•˜๋„๋ก, `append`, `pop`์„ ํ™œ์šฉํ•œ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin


def dfs(cur_idx, depth):
    global answer, sub_value

    if cur_idx == depth:
        # ์ž…๋ ฅ ๊ฐ’ (์ˆ˜์‹)์€ ์ œ์™ธ.
        if ''.join(sub_value) != ''.join(string):
            answer.add(''.join(sub_value))
        return

    is_bracket = string[cur_idx]

    # ์—ฌ๋Š” ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
    if is_bracket == '(':
        check[cur_idx] = True
        dfs(cur_idx + 1, depth)
        check[cur_idx] = False

    # ๋‹ซ๋Š” ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ์ด๊ณ , ์ฒดํฌ ํ•ด๋‘” ์Œ์— ์žˆ๋Š” ๊ฒฝ์šฐ
    if is_bracket == ')' and check[pair[cur_idx]]:
        dfs(cur_idx + 1, depth)
    # ๊ด„ํ˜ธ๋ฅผ ์ง€์šฐ์ง€ ์•Š๊ฑฐ๋‚˜, ์ผ๋ฐ˜ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ
    else:
        sub_value.append(is_bracket)
        dfs(cur_idx + 1, depth)
        sub_value.pop()


if __name__ == '__main__':
    string = list(stdin.readline().strip())
    stack = []
    check = [False for _ in range(len(string))]
    pair = [0 for _ in range(len(string))]
    answer = set()
    sub_value = []

    # ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ๋ผ๋ฆฌ, ์Œ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•จ
    for idx, bracket in enumerate(string):
        if bracket == '(':
            stack.append(idx)
        elif bracket == ')':
            pair[idx] = stack[-1]
            pair[stack[-1]] = idx
            stack.pop()

    dfs(0, len(string))

    # ์ถœ๋ ฅ ์‹œ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ •๋ ฌ.
    print('\n'.join(sorted(answer)))

 

 

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€