문제 링크
https://leetcode.com/problems/permutations/
나의 풀이
소스 코드
from typing import List
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def dfs(curr=[]):
# 예외 처리
if len(curr) == len(nums):
result.append(curr)
return
for num in nums:
if num not in curr:
# 리스트 복사 후 요소를 추가하여 재귀 수행
new_nums = curr[:]
new_nums.append(num)
dfs(new_nums)
result = []
dfs()
return result
문제 풀이
1. DFS를 활용한 순열 생성
- 위의 풀이와 마찬가지로 주의할 점은 리스트에 결과를 추가할 때 리스트를 복사(
[:]
)하여 추가해야 한다.
소스 코드
from typing import List
class Solution1:
def permute(self, nums: List[int]) -> List[List[int]]:
results = []
prev_elements = []
def dfs(elements):
# 리프 노드일 때 결과 추가
if len(elements) == 0:
results.append(prev_elements[:])
# 순열 생성 재귀 호출
for e in elements:
next_elements = elements[:]
next_elements.remove(e)
prev_elements.append(e)
dfs(next_elements)
prev_elements.pop()
dfs(nums)
return results
itertools
모듈 사용
2. 소스 코드
from typing import List
import itertools
class Solution2:
def permute(self, nums: List[int]) -> List[List[int]]:
# 리트코드에서는 리스트 반환 문제도 튜플로 반환하면 정답으로 처리되므로
# 아래와 같이 작성해도 문제는 없음
# return list(itertools.permutations(nums))
return list(map(list, itertools.permutations(nums)))
배운 점
객체 복사 방법
[:]
사용copy()
메소드 사용copy.deepcopy()
메소드 사용- 중첩된 리스트와 같이 복잡한 리스트도 복사할 수 있다. (깊은 복사)
copy
모듈을 임포트한 후 사용할 수 있다.