일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 2004 #조합 0의 개수 #백준
- dfs #python #leetcode #combination
- exoplayer #mediaplayer #엑소플레이어 #안드로이드 #android
- 다익스트라 #dijkstra #leetcode #파이썬 #python #algorithm #787
- python #백준 #2580 #스도쿠 #dfs #백트래킹
- 아스테리스크 #Asterisk #파이썬
- gcd #최대공약수 #백준 #2981 #검문
- dfs #bfs #leetcode #python
- final #java #자바 #안드로이드
- 리트코드 #팰린드롬 #파이썬
- python #백준 #9375 #패션왕 #신해빈
- leetcode #subsets #dfs #itertools #python
- dfs #leetcode #python
- dfs #그래프 #graph #python #leetcode #course #schedule
- 코틀린 #Do it #깡샘 #안드로이드
- context #android #getApplicationContext #activity #생명주기 #lifecycle
- dfs #leetcode #python #graph #그래프
- dfs #bfs #트리구조 #이진트리 #leetcode #파이썬 #python
- 다익스트라 #알고리즘 #bfs #그리디 #다이나믹프로그래밍 #leetcode #python
- AsyncTask #doinbackground #스레드 #thread #android #안드로이드
- 해시테이블 #heapq #파이썬 #리트코드 #알고리즘
- 파이썬 #zip
- dfs #bfs #이진트리 #파이썬 #리트코드
- Python #leetcode #dfs #그래프 #백트래킹
- dfs #bfs #트리구조 #이진트리 #leetcode #python #파이썬
- leetcode #python #dfs #재귀
- dfs #python #leetcode
- dfs #이진트리 #트리구조 #직렬화 #역직렬화 #파이썬 #리트코드 #leetcode #python
- 백준 #파이썬 #bfs #백트래킹 #1697 #숨바꼭질
- handler #looper #thread #runnable #핸들러 #루퍼 #스레드 #러너블
- Today
- Total
멋진 개발자가 되고 싶다
[LeetCode/Python] 46. 순열(Permutations) 본문
서로 다른 정수를 입력받아 가능한 모든 순열을 리턴하라.
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)))
을 쓰자.