코딩 테스트 (Python)/리트코드
[리트코드] 46. 순열 (Python)
hihyuk
2024. 1. 10. 12:31
Permutations - LeetCode
Can you solve this real interview question? Permutations - Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order. Example 1: Input: nums = [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],
leetcode.com
문제
배열을 입력받고 가능한 모든 수열을 출력해라
과정
- 순열이란 모든 가능한 경우를 그래프 형태로 나열한 결과이다.
- 즉, 백트래킹을 이용하여 문제를 풀어준다.
- 백트래킹(backtracking)이란 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법을 말한다.
입력
[1,2,3]
출력
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
풀이
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
result = []
def dfs(next, prev):
if not prev:
return result.append(next)
for i, num in enumerate(prev):
dfs(next + [num], prev[:i] + prev[i+1:])
dfs([], nums)
return result
한 줄씩 코드 해석해보기
result = []
- 결과를 출력할 리스트를 생성한다.
def dfs(next, prev):
if not prev:
return result.append(next)
- 백트래킹 함수 dfs를 만들어준다. (next는 결과를 저장할 리스트이고, prev는 아직 저장되지 않은 리스트값이다.)
- prev 리스트에 값이 없다면 순열을 다 돈것이므로 result 에 append해준후 반환한다.
for i, num in enumerate(prev):
dfs(next + [num], prev[:i] + prev[i+1:])
- prev 리스트를 enumerate를 활용해 인덱스값과 각 숫자들을 받아온다.
- next 리스트에 새로 받아오는 값을 가지고 새로운 리스트를 만들어 추가해준다.
- 그 다음 이전 값에서 i번째 값을 삭제해 줘야하기 때문에 i의 이전 값고 i+1의 다음값을 합쳐주면서 삭제해준다.
dfs([], nums)
return result
- 처음 dfs함수에 들어가는 값은 next에는 빈 리스트 prev에는 입력받은 nums가 들어가게 된다.
- 결과를 리턴해준다.
한 줄 풀이
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(itertools.permutations(nums))
- itretools.permutations(list) : list의 값들을 모든 가능한 순서, 반복되는 요소 없이 반환한다. 즉, 순열을 만들어 준다.