728x90
📍 재귀를 이용하여 부분 집합, 순열, 조합 구하기
코딩테스트 문제를 풀다 보면 제목과 같이 부분집합(subSet)
, 순열(permutation)
, 조합(combination)
을 구해야 하는일이 간혹 있다. 그때마다 코드를 구현하려니까 시간이 부족해서 다른 부분에 시간을 쏟지 못한 적이 있었다. 어떻게 구현해야 하는지 간단하게 알아보자.
arr=[1, 2, 3, 4]
로 예를 들어 나올 수 있는 경우의 수를 구해보는데, 모두 재귀(DFS)
를 이용하여 구했다. 부분집합은 출력하는 모든 경우의 수를 구하고, 순열은 중복을 허용 / 허용하지 않고 일렬로 세우는 방법, 조합은 4개 중 2개를 뽑는 경우의 수로 가정해서 구했다. 이를 응용한 문제는 다음을 참고하자.
728x90
let n = 4; let arr = [1, 2, 3, 4]; // 부분집합(subSet), 2^4=16 console.log(solution(n, arr)); function solution(n, arr){ let temp = Array.from({length: n}, () => 0); function DFS(L){ if (L === n){ console.log(temp); }else{ temp[L] = arr[L]; DFS(L+1); temp[L] = 0; DFS(L+1) } } DFS(0) } 👉🏽 [ 1, 2, 3, 4 ] [ 1, 2, 3, 0 ] [ 1, 2, 0, 4 ] [ 1, 2, 0, 0 ] [ 1, 0, 3, 4 ] [ 1, 0, 3, 0 ] [ 1, 0, 0, 4 ] [ 1, 0, 0, 0 ] [ 0, 2, 3, 4 ] [ 0, 2, 3, 0 ] [ 0, 2, 0, 4 ] [ 0, 2, 0, 0 ] [ 0, 0, 3, 4 ] [ 0, 0, 3, 0 ] [ 0, 0, 0, 4 ] [ 0, 0, 0, 0 ] // 순열(중복 허용 o), 4^4=256 function solution(n, arr){ let temp = Array.from({length: n}, () => 0); function DFS(L){ if (L === n){ console.log(temp); }else{ for (let i=0; i<n; i++){ temp[L] = arr[i]; DFS(); } } } DFS(0) } 👉🏽 [ 1, 1, 1, 1 ] [ 1, 1, 1, 2 ] [ 1, 1, 1, 3 ] [ 1, 1, 1, 4 ] [ 1, 1, 2, 1 ] [ 1, 1, 2, 2 ] [ 1, 1, 2, 3 ] [ 1, 1, 2, 4 ] [ 1, 1, 3, 1 ] [ 1, 1, 3, 2 ] [ 1, 1, 3, 3 ] [ 1, 1, 3, 4 ] [ 1, 1, 4, 1 ] [ 1, 1, 4, 2 ] [ 1, 1, 4, 3 ] [ 1, 1, 4, 4 ] [ 1, 2, 1, 1 ] [ 1, 2, 1, 2 ] [ 1, 2, 1, 3 ] [ 1, 2, 1, 4 ] [ 1, 2, 2, 1 ] [ 1, 2, 2, 2 ] [ 1, 2, 2, 3 ] [ 1, 2, 2, 4 ] [ 1, 2, 3, 1 ] [ 1, 2, 3, 2 ] [ 1, 2, 3, 3 ] [ 1, 2, 3, 4 ] [ 1, 2, 4, 1 ] [ 1, 2, 4, 2 ] [ 1, 2, 4, 3 ] [ 1, 2, 4, 4 ] [ 1, 3, 1, 1 ] [ 1, 3, 1, 2 ] [ 1, 3, 1, 3 ] [ 1, 3, 1, 4 ] [ 1, 3, 2, 1 ] [ 1, 3, 2, 2 ] [ 1, 3, 2, 3 ] [ 1, 3, 2, 4 ] [ 1, 3, 3, 1 ] [ 1, 3, 3, 2 ] [ 1, 3, 3, 3 ] [ 1, 3, 3, 4 ] [ 1, 3, 4, 1 ] [ 1, 3, 4, 2 ] [ 1, 3, 4, 3 ] [ 1, 3, 4, 4 ] [ 1, 4, 1, 1 ] [ 1, 4, 1, 2 ] [ 1, 4, 1, 3 ] [ 1, 4, 1, 4 ] [ 1, 4, 2, 1 ] [ 1, 4, 2, 2 ] [ 1, 4, 2, 3 ] [ 1, 4, 2, 4 ] [ 1, 4, 3, 1 ] [ 1, 4, 3, 2 ] [ 1, 4, 3, 3 ] [ 1, 4, 3, 4 ] [ 1, 4, 4, 1 ] [ 1, 4, 4, 2 ] [ 1, 4, 4, 3 ] [ 1, 4, 4, 4 ] [ 2, 1, 1, 1 ] [ 2, 1, 1, 2 ] [ 2, 1, 1, 3 ] [ 2, 1, 1, 4 ] [ 2, 1, 2, 1 ] [ 2, 1, 2, 2 ] [ 2, 1, 2, 3 ] [ 2, 1, 2, 4 ] [ 2, 1, 3, 1 ] [ 2, 1, 3, 2 ] [ 2, 1, 3, 3 ] [ 2, 1, 3, 4 ] [ 2, 1, 4, 1 ] [ 2, 1, 4, 2 ] [ 2, 1, 4, 3 ] [ 2, 1, 4, 4 ] [ 2, 2, 1, 1 ] [ 2, 2, 1, 2 ] [ 2, 2, 1, 3 ] [ 2, 2, 1, 4 ] [ 2, 2, 2, 1 ] [ 2, 2, 2, 2 ] [ 2, 2, 2, 3 ] [ 2, 2, 2, 4 ] [ 2, 2, 3, 1 ] [ 2, 2, 3, 2 ] [ 2, 2, 3, 3 ] [ 2, 2, 3, 4 ] [ 2, 2, 4, 1 ] [ 2, 2, 4, 2 ] [ 2, 2, 4, 3 ] [ 2, 2, 4, 4 ] [ 2, 3, 1, 1 ] [ 2, 3, 1, 2 ] [ 2, 3, 1, 3 ] [ 2, 3, 1, 4 ] [ 2, 3, 2, 1 ] [ 2, 3, 2, 2 ] [ 2, 3, 2, 3 ] [ 2, 3, 2, 4 ] [ 2, 3, 3, 1 ] [ 2, 3, 3, 2 ] [ 2, 3, 3, 3 ] [ 2, 3, 3, 4 ] [ 2, 3, 4, 1 ] [ 2, 3, 4, 2 ] [ 2, 3, 4, 3 ] [ 2, 3, 4, 4 ] [ 2, 4, 1, 1 ] [ 2, 4, 1, 2 ] [ 2, 4, 1, 3 ] [ 2, 4, 1, 4 ] [ 2, 4, 2, 1 ] [ 2, 4, 2, 2 ] [ 2, 4, 2, 3 ] [ 2, 4, 2, 4 ] [ 2, 4, 3, 1 ] [ 2, 4, 3, 2 ] [ 2, 4, 3, 3 ] [ 2, 4, 3, 4 ] [ 2, 4, 4, 1 ] [ 2, 4, 4, 2 ] [ 2, 4, 4, 3 ] [ 2, 4, 4, 4 ] [ 3, 1, 1, 1 ] [ 3, 1, 1, 2 ] [ 3, 1, 1, 3 ] [ 3, 1, 1, 4 ] [ 3, 1, 2, 1 ] [ 3, 1, 2, 2 ] [ 3, 1, 2, 3 ] [ 3, 1, 2, 4 ] [ 3, 1, 3, 1 ] [ 3, 1, 3, 2 ] [ 3, 1, 3, 3 ] [ 3, 1, 3, 4 ] [ 3, 1, 4, 1 ] [ 3, 1, 4, 2 ] [ 3, 1, 4, 3 ] [ 3, 1, 4, 4 ] [ 3, 2, 1, 1 ] [ 3, 2, 1, 2 ] [ 3, 2, 1, 3 ] [ 3, 2, 1, 4 ] [ 3, 2, 2, 1 ] [ 3, 2, 2, 2 ] [ 3, 2, 2, 3 ] [ 3, 2, 2, 4 ] [ 3, 2, 3, 1 ] [ 3, 2, 3, 2 ] [ 3, 2, 3, 3 ] [ 3, 2, 3, 4 ] [ 3, 2, 4, 1 ] [ 3, 2, 4, 2 ] [ 3, 2, 4, 3 ] [ 3, 2, 4, 4 ] [ 3, 3, 1, 1 ] [ 3, 3, 1, 2 ] [ 3, 3, 1, 3 ] [ 3, 3, 1, 4 ] [ 3, 3, 2, 1 ] [ 3, 3, 2, 2 ] [ 3, 3, 2, 3 ] [ 3, 3, 2, 4 ] [ 3, 3, 3, 1 ] [ 3, 3, 3, 2 ] [ 3, 3, 3, 3 ] [ 3, 3, 3, 4 ] [ 3, 3, 4, 1 ] [ 3, 3, 4, 2 ] [ 3, 3, 4, 3 ] [ 3, 3, 4, 4 ] [ 3, 4, 1, 1 ] [ 3, 4, 1, 2 ] [ 3, 4, 1, 3 ] [ 3, 4, 1, 4 ] [ 3, 4, 2, 1 ] [ 3, 4, 2, 2 ] [ 3, 4, 2, 3 ] [ 3, 4, 2, 4 ] [ 3, 4, 3, 1 ] [ 3, 4, 3, 2 ] [ 3, 4, 3, 3 ] [ 3, 4, 3, 4 ] [ 3, 4, 4, 1 ] [ 3, 4, 4, 2 ] [ 3, 4, 4, 3 ] [ 3, 4, 4, 4 ] [ 4, 1, 1, 1 ] [ 4, 1, 1, 2 ] [ 4, 1, 1, 3 ] [ 4, 1, 1, 4 ] [ 4, 1, 2, 1 ] [ 4, 1, 2, 2 ] [ 4, 1, 2, 3 ] [ 4, 1, 2, 4 ] [ 4, 1, 3, 1 ] [ 4, 1, 3, 2 ] [ 4, 1, 3, 3 ] [ 4, 1, 3, 4 ] [ 4, 1, 4, 1 ] [ 4, 1, 4, 2 ] [ 4, 1, 4, 3 ] [ 4, 1, 4, 4 ] [ 4, 2, 1, 1 ] [ 4, 2, 1, 2 ] [ 4, 2, 1, 3 ] [ 4, 2, 1, 4 ] [ 4, 2, 2, 1 ] [ 4, 2, 2, 2 ] [ 4, 2, 2, 3 ] [ 4, 2, 2, 4 ] [ 4, 2, 3, 1 ] [ 4, 2, 3, 2 ] [ 4, 2, 3, 3 ] [ 4, 2, 3, 4 ] [ 4, 2, 4, 1 ] [ 4, 2, 4, 2 ] [ 4, 2, 4, 3 ] [ 4, 2, 4, 4 ] [ 4, 3, 1, 1 ] [ 4, 3, 1, 2 ] [ 4, 3, 1, 3 ] [ 4, 3, 1, 4 ] [ 4, 3, 2, 1 ] [ 4, 3, 2, 2 ] [ 4, 3, 2, 3 ] [ 4, 3, 2, 4 ] [ 4, 3, 3, 1 ] [ 4, 3, 3, 2 ] [ 4, 3, 3, 3 ] [ 4, 3, 3, 4 ] [ 4, 3, 4, 1 ] [ 4, 3, 4, 2 ] [ 4, 3, 4, 3 ] [ 4, 3, 4, 4 ] [ 4, 4, 1, 1 ] [ 4, 4, 1, 2 ] [ 4, 4, 1, 3 ] [ 4, 4, 1, 4 ] [ 4, 4, 2, 1 ] [ 4, 4, 2, 2 ] [ 4, 4, 2, 3 ] [ 4, 4, 2, 4 ] [ 4, 4, 3, 1 ] [ 4, 4, 3, 2 ] [ 4, 4, 3, 3 ] [ 4, 4, 3, 4 ] [ 4, 4, 4, 1 ] [ 4, 4, 4, 2 ] [ 4, 4, 4, 3 ] [ 4, 4, 4, 4 ] // 순열(중복 허용 x) 4x3x2x1=24 let n = 4; let arr = [1, 2, 3, 4] console.log(solution(arr)); function solution(arr){ let temp = Array.from({length: n}, () => 0); let visited = Array.from({length: n}, () => 0); let cnt=0; function DFS(L){ if (L === n){ cnt++ console.log(temp); }else{ for (let i=0; i<n; i++){ if (visited[i] === 0){ visited[i] = 1; temp[L] = arr[i]; DFS(L+1); visited[i] = 0; } } } } DFS(0) console.log(cnt) } 👉🏽 [ 1, 2, 3, 4 ] [ 1, 2, 4, 3 ] [ 1, 3, 2, 4 ] [ 1, 3, 4, 2 ] [ 1, 4, 2, 3 ] [ 1, 4, 3, 2 ] [ 2, 1, 3, 4 ] [ 2, 1, 4, 3 ] [ 2, 3, 1, 4 ] [ 2, 3, 4, 1 ] [ 2, 4, 1, 3 ] [ 2, 4, 3, 1 ] [ 3, 1, 2, 4 ] [ 3, 1, 4, 2 ] [ 3, 2, 1, 4 ] [ 3, 2, 4, 1 ] [ 3, 4, 1, 2 ] [ 3, 4, 2, 1 ] [ 4, 1, 2, 3 ] [ 4, 1, 3, 2 ] [ 4, 2, 1, 3 ] [ 4, 2, 3, 1 ] [ 4, 3, 1, 2 ] [ 4, 3, 2, 1 ] 24 // 조합(4개 중 2개를 뽑는 경우의 수), 4C2=6 let n = 4; let m = 2; let arr = [1, 2, 3, 4] console.log(solution(n, arr)); function solution(n, arr){ let temp = Array.from({length: m}, () => 0); let cnt=0; function DFS(L, S){ if (L === m){ cnt++ console.log(temp); }else{ for (let i=S; i<n; i++){ temp[L] = arr[i]; DFS(L+1, i+1); } } } DFS(0, 0) console.log(cnt) } 👉🏽 [ 1, 2 ] [ 1, 3 ] [ 1, 4 ] [ 2, 3 ] [ 2, 4 ] [ 3, 4 ] 6
반응형
'Algorithm > 논리적사고(Logical Think)' 카테고리의 다른 글
[ 논리적사고 ] - 누적 값이 point보다 높은지 낮은지 비교하고 추가하기 (0) | 2021.09.08 |
---|---|
[ 논리적사고 ] - 배열 중간에 있는 값을 맨 앞으로 옮기기 (0) | 2021.09.03 |
[ 자바스크립트(JavaScript) ] 2차원 행렬 sort하기 (0) | 2021.08.20 |
[ 논리적사고 ] - string함수 사용하지 않고 자연수 거꾸로 뒤집기 (0) | 2021.08.20 |
[ 논리적사고 ] - 자연수의 자릿수 합 구하기 (0) | 2021.08.20 |
댓글