반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[LeetCode/Python] 46. 순열(Permutations) 본문

카테고리 없음

[LeetCode/Python] 46. 순열(Permutations)

오패산개구리 2021. 7. 25. 16:18
728x90
반응형

서로 다른 정수를 입력받아 가능한 모든 순열을 리턴하라.

 

Example:

 

Input: nums = [1,2,3]

 

Output: [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]

 

 

 

 

 

 

 

1. 내가 직접 푼 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def dfs(stack=None):
            if stack is None:
                stack = []
            if len(stack) == len(nums):
                output.append(stack)
                return
            for w in nums:
                if w not in stack:
                    dfs(stack+[w])
 
 
        output = []
        dfs()
        return output
cs

 

해설:

 

dfs를 재귀로 구현하였다.

 

stack에 하나씩 추가해가며 최종적으로 길이가 다 찼을 때 output에 입력하고 리턴하였다.

 

재귀 함수를 쓸 때는 입력값을 어떻게 주느냐를 고민하는데 시간이 많이 드는 것 같다.

 

 

 

 

 

 

 

** 깔끔한 코드 **

 

 

 

 

2. 모든 조합 탐색

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
    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
cs

 

해설:

 

나와 같이 dfs를 재귀로 구현한 코드이다.

 

prev_elements에 nums가 들락날락거리게 되는데

 

elements의 길이가 0일 때

 

즉, prev_elements가 result에 들어갈 요건이 됐을 때

 

result에 추가하게 되는데 왜 prev_elements [:]라 했을까?

 

그 이유는 prev_elements라 하면 results에 참조된 prev_elements가 들어가는 거라

 

prev_elements가 바뀔 때 마다 results에 들어있는 값도 계속 바뀐다.

 

그래서 prev_elements.copy() 혹은 prev_elements.deepcopy() 같은 걸 붙여줘야 한다.

 

 

 

 

 

3. itertools를 모듈 사용

 

 

1
2
3
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        return list(itertools.permutations(nums))
cs

 

해설:

 

itertools라는 모듈이 있다.

 

여기에 리스트를 넣으면 모든 순열이 나온다.

 

코딩 테스트에선 써도 되지만

 

코딩 인터뷰 때는 "이걸 써도 되지만"이라 언급하며 위와 같은 식으로 풀자.

 

저렇게 풀면 튜플 값이 리턴되는데 답은 맞지만 리스트를 리턴 하고 싶다면

 

return list(map(list,itertools.permutations(nums)))

 

을 쓰자.

728x90
반응형