leetcode 22 Generate Parentheses
나는 보통 DFS를 돌 때 아래와 같은 방식을 사용한다.
1. 체크할 변수에 root를 반영
2. root에서 다음 갈 수 있는 자리(togo) 선정
3. for loc in togo: 에 대해서 dfs 실행
def helper(path, root, cum):
nonlocal ans, n
if len(path)==n:
ans.append(path)
return
path.append(root)
cum += root
if cum == 0: togo = [1]
if cum == n: togo = [-1]
else: togo[-1, 1]
for loc in togo:
dfs_helper(path, loc, cum)
하지만 이렇게 되면 처음 리프로 다녀와서 두번째 리프를 찾아 나설 때, path가 이미 가득 차 있게 된다. 그렇다고 return 전에 path를 초기화하자니 다음 리프로의 탐색이 path=None 상태에서 다시 시작하는 것도 아니기 때문에 이렇게도 불가능하다.
이 문제에서는 이를 방지하기 위해 변수에 할당하지 않고 직접 재귀함수에 값을 넣어주었다. 한번 리프에 다녀오더라도 고정된 값에서부터 출발하기 때문에 원하는 탐색을 진행할 수 있게 된다.
if cum == 0:
dfs_helper(str1+'(', cum+1)
elif cum == n:
dfs_helper(str1+')', cum-1)
else:
dfs_helper(str1+'(', cum+1)
dfs_helper(str1+')', cum-1)
n쌍의 괄호를 사용해서 유효한 모든 괄호문자 만들기
PSEUDO 1
Solution 1도 시간 제한 내에 통과하였으나 포스팅 길이가 길어지니 풀 코드는 아래 github에서 참고
PSEUDO 2
def sol_2(n):
ans = list()
def dfs_helper(str1, cum):
nonlocal ans, n
if len(str1) == n*2:
if cum == 0:
ans.append(str1)
return
if cum == 0:
dfs_helper(str1+'(', cum+1)
elif cum == n:
dfs_helper(str1+')', cum-1)
else:
dfs_helper(str1+'(', cum+1)
dfs_helper(str1+')', cum-1)
dfs_helper(str(), 0)
return ans