[Python] Leetcode 46. permutations


Leetcode 46 permutations

문제

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

입력

arr = [1,2,3]

출력

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

풀이

  • 파이썬에 내장된 itertools 패키지의 combinations 모듈과 permutations 모듈을 통해 손쉽게 순열과 조합을 구할 수 있다.
  • itertools 모듈을 쓰지 못하는 경우 재귀를 통해 구현할 수 있으나 막상 짜보니 어려워 정리해보려고 한다.
  • 조합의 경우는 start 패러미터를 추가로 받는다. (중복을 제거하기 위해)
# 순열
# 서로 다른 정수를 입력받아 가능한 모든 순열을 리턴하라
arr = [1, 2, 3]
n = len(arr)
visited = [False]*n
answer = []

def permutation(depth, result):
    if depth == n:
        # 리프 노드일때 결과 추가
        answer.append(result)
        return 
    for i in range(len(my_list)):
        if not visited[i]:
            visited[i] = True
            permutation(depth+1, result+[my_list[i]])
            visited[i] = False

permutation(0, []) 
print(answer) # [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
# 조합
# 전체 수 n을 입력받아 k개의 조합을 리턴하라
n = 4
k = 2
arr = [x for x in range(1,n+1)]
visited = [False]*n

answer = []
visited = [False]*n
def combination(depth, result, start):
    if depth == k:
        answer.append(result)
        return
    for i in range(start, len(my_list)+1):
        if not visited[i]:
            visited[i] = True
            combination(depth+1, result+[arr[i]], i)
            visited[i] = False
combination(0,[],0)
print(answer) # [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]