https://leetcode.com/problems/generate-parentheses/
ํํธ
https://www.youtube.com/watch?v=s9fokUqJ76A
์ด๋ป๊ฒ ํ์ด์ผ ํ๋ 30๋ถ ์ ๋ ๊ณ ๋ฏผํ๋ค๊ฐ, ์ ์์์ ์ฐธ๊ณ ํด์ ํํธ๋ฅผ ์ป์ด์๋ค.
๊ท์น์ close ๊ฐฏ์ < open ๊ฐฏ์ ์ฌ์ผ ํ๋ค๋ ๊ฒ !
1์ฐจ ํ์ด
๊ทธ ๊ท์น์ ์ฐธ๊ณ ํด์ bfs๋ก ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์๋ค.
ํ๋ฉด์ stack ์ ํ์ผ๋ก neetcode์์ ์ ์ํ ๋ฌธ์ ์ง๋ง dfs..๋ก ์ ๊ทผํ๋๊ฒ ๋ง๋ ํ์ง๋ง,
๊ทธ๋๋ ํธ๋ ๊ฒ์ ์์๋ฅผ ๋๊ณ ํ์๋ค.
class Solution(object):
res = []
def dfs(self, current, n):
openCnt = current.count("(")
closeCnt = current.count(")")
if len(current) == 2 * n:
if openCnt == n and closeCnt == n:
self.res.append(current)
return;
else:
# close ๊ฐฏ์ < open ๊ฐฏ์
if closeCnt <= openCnt:
self.dfs(current + "(", n)
self.dfs(current + ")", n)
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
self.res = [] # ํ
์คํธ ์ผ์ด์ค ์ ์ ์์ ์ ๋๋ฆฐ ๊ฐ ์ด๊ธฐํ
self.dfs("(", n)
return self.res
ํด์ค
์ ์์์์ ์ ์ํ ํ์ด.
stack์๋ค๊ฐ ๋ฃ๊ณ backtrack์ผ๋ก ํจ์๋ฅผ ๋๋ฉด์ ํผ๋ค.
def generateParenthesis(self, n):
# only add open paranthesis if open < n
# only add a closing paranthesis if closed < open
# valid IIF open == closed == n
stack = []
res = []
def backtrack(openN, closedN):
if openN == closedN == n:
res.append("".join(stack))
return
if openN < n:
stack.append("(")
backtrack(openN + 1, closedN)
stack.pop() # clean up ..
if closedN < openN:
stack.append(")")
backtrack(openN, closedN + 1)
stack.pop()
backtrack(0,0)
return res
๋ฐ์ํ