< All posts

22. Generate Parentheses

๋ฌธ์ œ ์„ค๋ช…

n์Œ์˜ ๊ด„ํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ์กฐํ•ฉ์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

22

ํ’€์ด ๋ฐ ํ•ด์„ค

์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. n์Œ์˜ ๊ด„ํ˜ธ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜ฌ๋ฐ”๋ฅธ ์กฐํ•ฉ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฑํŠธ๋ž˜ํ‚น ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ด„ํ˜ธ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์‚ฌ๋ก€๋กœ, ํ˜„์žฌ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ 2n์ด ๋˜๋ฉด ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ๊ท€ ๋‹จ๊ณ„์—์„œ๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ '('์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ ')'๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฐ๊ฐ์„ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ์กฐํ•ฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ: ๊ธฐ์–ตํ•ด์•ผ ํ•  ์ •๋ณด๋ฅผ ๋ฐฑํŠธ๋ž˜ํ‚น ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ํƒ€๊ฒŸ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ์กฐํ•ฉ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ด๋•Œ, ์—ฌ๋Š” ๊ด„ํ˜ธ์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        res = []

        def backtrack(open_cnt, close_cnt, path):
            if len(path)==n*2:
                res.append(path[:])
                return
            
            if open_cnt < n:
                backtrack(open_cnt+1, close_cnt, path+"(")
            
            if close_cnt < open_cnt:
                backtrack(open_cnt, close_cnt+1, path+")")

        
        backtrack(0, 0, "")
        return res

๋ณต์žก๋„

c

์‹œ๊ฐ„๋ณต์žก๋„

  • O(4^n / sqrt(n)) ; n์€ ๊ด„ํ˜ธ ์Œ์˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ์กฐํ•ฉ์˜ ์ˆ˜๋Š” ์นดํƒˆ๋ž€ ์ˆ˜๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ด๋Š” ๋Œ€๋žต์ ์œผ๋กœ O(4^n / sqrt(n))์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ฐ„๋ณต์žก๋„

  • O(n) ; ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ๊ณผ ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

Constraint Analysis

Constraints:
1 <= n <= 8

References

ยฉ 2025 HyunJoon Sung. All Rights Reserved.

GitHub