Python/코딩 문제
[리트코드] 22. Generate Parentheses
green_ne
2022. 2. 23. 08:23
# 문제 설명
n개의 괄호() 쌍이 주어질 때, 규칙에 맞게 잘 생성된 모든 괄호 조합을 반환해라.
# 입출력 예시
입력 | 출력 |
3 | ["((()))","(()())","(())()","()(())","()()()"] |
1 | ["()"] |
# 코드 풀이 1
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
paths = []
def make_paths(path, cnt):
if len(path) == n*2: # 모두 완성된 상태
paths.append(path[:])
return
if cnt < 1: # '('개수가 다 들어간 상태
make_paths(path+')', cnt)
return
if path.count('(')-path.count(')') < 1: # '('이 와야만 하는 상태
make_paths(path+'(', cnt-1)
return
make_paths(path+'(', cnt-1)
make_paths(path+')', cnt)
make_paths('', n)
return paths
# 코드 풀이 2: Backtracking
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
ans = []
def backtrack(S = [], left = 0, right = 0):
if len(S) == 2 * n:
ans.append("".join(S))
return
if left < n: # '('가 가능하다면
S.append("(")
backtrack(S, left+1, right)
S.pop()
if right < left: # ')'가 가능하다면
S.append(")")
backtrack(S, left, right+1)
S.pop()
backtrack()
return ans
# 코드 풀이 3: Closure Number
class Solution(object):
def generateParenthesis(self, N):
if N == 0: return ['']
ans = []
for c in xrange(N):
for left in self.generateParenthesis(c):
for right in self.generateParenthesis(N-1-c):
ans.append('({}){}'.format(left, right))
return ans
N은 1보다 항상 크고, 언제나 (에서 시작하고 )으로 끝난다.
# 핵심 포인트
- n개의 괄호 쌍을 모두 사용해야 하므로 n*2 길이가 되면 답이 된다.
- 문자열의 + 연산은 원래 문자열에 영향을 미치지 않는다.
반응형