class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# 1) Permutations - DFS 구현 (위에 코드에서 바꿈)
results = []
prev_elements = []
# permutations를 dfs로 구현
def dfs(elements,n):
# A. 리프 노드일 때 결과 추가
if len(elements) == len(nums)-n:
results.append(prev_elements[:]) # deepcopy를 이용해 복사 중요
# B. 순열 생성 재귀 호출 (루트->인터널 이동하며 path기록)
for e in elements:
# 앞에서부터 슬라이싱하여 모든 경우의 수에 대한 dfs
next_elements = elements[:] # deepcopy를 이용해 복사 중요
next_elements.remove(e) # 슬라이싱할거기 때문에 remove사용 (1개남을 경우 [1:]하면 out of range)
prev_elements.append(e)
dfs(next_elements,n)
prev_elements.pop() # dfs 완전히 끝까지 간게 끝나면 결과에 path추가했으니, prev는 pop해야함
dfs(nums,3) #(= permutations(nums, 내가 원하는 수) 임)
print(results)
return results
import copy
a = [1,2,3,...]
b = copy.deepcopy(a)
a[0] = 100
출력결과 : a = [100, 2, 3, ...] b = [1, 2, 3, ...]
이전 값을 하나씩 덧붙여 계속 재귀 호출을 진행하다 리프노드에 도달한 경우(= len(elements)==0) 결과를 하나씩 추가
중요한 점은, 결과를 추가할 때 prev_elements[:] 로 처리해야한다는 점이다.
따라서 반드시 복사할 땐 다음 방법들을 사용하자
dfs로 구현하면 되는 이유
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# 1) DFS 풀이
results = []
prev_elements = []
def dfs(elements):
# A. 리프 노드일 때 결과 추가
if len(elements) == 0:
results.append(prev_elements[:]) # deepcopy를 이용해 복사 중요
# B. 순열 생성 재귀 호출 (루트->인터널 이동하며 path기록)
for e in elements:
# 앞에서부터 하나씩만 빼보며 모든 경우의 수에 대한 dfs
next_elements = elements[:] # deepcopy를 이용해 복사 중요
next_elements.remove(e) # 슬라이싱할거기 때문에 remove사용 (1개남을 경우 [1:]하면 out of range)
prev_elements.append(e)
dfs(next_elements)
prev_elements.pop() # dfs 완전히 끝까지 간게 끝나면 결과에 path추가했으니, prev는 pop해야함
dfs(nums) #(= permutations(nums, len(nums)) 임)
return results
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# 2) 라이브러리 사용
return list(itertools.permutations(nums))
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
results = []
def dfs(elements, start, k):
if k == 0:
results.append(elements[:])
# 자신 이전의 모든 값을 고정하여 재귀 호출
for i in range(start, n + 1):
elements.append(i)
dfs(elements, i + 1, k - 1)
elements.pop()
dfs([], 1, k)
return results