순열
function permutation(arr, selectNum) {
let result = [];
if (selectNum === 1) return arr.map((v) => [v]);
arr.forEach((v, idx, arr) => {
const fixer = v;
const restArr = arr.filter((_, index) => index !== idx);
const permuationArr = permutation(restArr, selectNum - 1);
const combineFixer = permuationArr.map((v) => [fixer, ...v]);
result.push(...combineFixer);
});
return result;
}
이해가 되긴 하는데 내일이면 또 새로울 것 같은 느낌이다.
permutation([1,2,3,4],2) 를 한번 디버깅 해보자.
우선은 v = 1 일때 idx = 1
const restArr = arr.filter((_, index) => index !== idx);
restArr 에는 필터로 인해 [2,3,4] 만 남게 된다.
const permuationArr = permutation([2,3,4], 1); 이 된다.
재귀 함수이지만 if 문으로 selectNun = 1 일때 permutationArr = [2,3,4] 그대로 되게 된다.
이제 fixer 에는 1 이 할당되어 있기때문에 combineFixer 에는 [1,2] , [1,3] , [1,4] 가 저장되는 것이다.
아 내가 설명하면서도 이해가 잘 되지 않은 것이 느껴진다.
조합
function combination(arr, selectNum) {
const result = [];
if (selectNum === 1) return arr.map((v) => [v]);
arr.forEach((v, idx, arr) => {
const fixed = v;
const restArr = arr.slice(idx + 1);
const combinationArr = combination(restArr, selectNum - 1);
const combineFix = combinationArr.map((v) => [fixed, ...v]);
result.push(...combineFix);
});
return result;
}
위의 순열 코드에서 filter 함수에서 arr.slice(idx+1) 로 변경이 되었다. slice 를 왜 썻냐하면, 조합같은 경우에 1,2 / 2,1 이 같은 것으로 취급된다. 따라서 2,1 같은 숫자가 다시 나오지 않게 하기위해서는 idx+1 로 슬라이스 하여 2일때는 arr에 [3,4]만 남게 해주어야 하는 것이다.
slice
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var arr1 = arr.slice(3, 5); // [4, 5]
var arr2 = arr.slice(undefined, 5); // [1, 2, 3, 4, 5]
var arr3 = arr.slice(-3); // [8, 9, 10]
var arr4 = arr.slice(-3, 9); // [8, 9]
var arr5 = arr.slice(10); // []
var arr6 = arr.slice(4); // [5, 6, 7, 8, 9, 10]
var arr7 = arr.slice(undefined); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var arr8 = arr.slice(5, -4); // [6]
var arr9 = arr.slice(2, 15); // [3, 4, 5, 6, 7, 8, 9, 10]
- arr1 : index번호 3부터 4까지 추출
- arr2 : index번호 0부터 4까지 추출
- arr3 : 뒤에서 3개 추출
- arr4 : 뒤에서부터 3번째 숫자인 8부터 추출하기 시작해서 앞에서부터 9번째 숫자(10) 전까지 추출하므로 숫자 8과 9 추출
- arr5 : 배열의 길이가 10이므로 index번호 10부터 추출하면 추출할 요소가 없으므로 빈 배열을 리턴한다.
- arr6 : index번호 4부터 끝까지 추출
- arr7 : 처음부터 끝까지 추출함
- arr8 : index번호 5번인 6부터 추출 시작하여 끝에서부터 -4번째인 7 전까지 추출하므로 숫자 6을 추출
- arr9 : index번호 2번부터 끝까지 추출
'공부기록 > 자바스크립트 코딩테스트' 카테고리의 다른 글
프로그래머스/JS 키패드 누르기 (0) | 2022.06.15 |
---|---|
프로그래머스/JS 소수 만들기 (0) | 2022.06.14 |
프로그래머스/JS 신고결과받기 (2) (0) | 2022.06.13 |
프로그래머스/JS 신고결과받기 (1) (0) | 2022.06.13 |
백준/JS 10828 (0) | 2022.06.12 |