JavaScript의 나비 셔플 배열은 배열의 중심에 접근하면 숫자가 감소하고 배열의 끝에 접근하면 증가하도록 정렬된 숫자 배열입니다. 가장 큰 숫자는 첫 번째 색인에 배치됩니다.
나비 셔플 배열의 또 다른 변형은 숫자가 중앙으로 증가하고 끝으로 갈수록 감소하는 경우입니다. 이 경우 가장 작은 숫자가 맨 처음 인덱스에 배치됩니다.
수학 배경을 가진 사람들에게 이것은 Guassiandistribution과 어느 정도 관련이 있습니다.
예
이 배열이 있다고 가정합니다 -
const arr = [8,2,6,3,9,1,4,5,0,7];
나비 셔플을 적용하면 출력은 -
가 됩니다.[9, 7, 5, 3, 1,0, 2, 4, 6, 8]
가장 큰 숫자와 두 번째로 큰 숫자가 양 끝단에 어떻게 배치되고 가장 작은 숫자가 중앙에 배치되는지 확인하세요.
또 다른 가능성은 -
[0, 2, 4, 6, 8, 9, 7, 5, 3, 1]
우리의 임무는 숫자 배열과 문자열을 두 번째 인수로 받는 함수를 작성하는 것입니다. 문자열은 'asc' 또는 'des' 두 값 중 하나를 사용할 수 있습니다. -
-
string이 'des'이면 배열을 오름차순에서 내림차순으로 섞어야 합니다.
-
'asc'인 경우 배열을 내림차순에서 오름차순으로 섞어야 합니다.
접근
-
문자열이 'asc'이면 처음에 배열을 오름차순으로 정렬하고 그렇지 않으면 내림차순으로 정렬합니다. 따라서 함수가 'asc'로 호출되었다고 가정하면 배열은 이제 −
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
그런 다음 배열을 두 개의 배열로 분할하여 인접한 요소가 반대 배열로 분산되도록 합니다. 한 배열의 요소를 밀어넣고 다른 배열의 요소를 이동 해제하여 수동으로 수행하지 않고도 한 배열이 반전되도록 합니다.
이렇게 형성된 두 개의 배열은 다음과 같습니다. -
[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
-
이제 마지막 단계는 이러한 배열을 연결하고 그 후에 필수 배열을 얻는 것입니다. 이 모든 것을 코드에 넣으면 다음과 같이 보일 것입니다 -
예시
const array = [8,2,6,3,9,1,4,5,0,7]; const butterflyShuffle = (array, order = 'asc') => { //creating a new copy of array so that we dont mutate the original array const arr = array.slice(); //sorting ascending or descending based on the argument arr.sort((a, b) => order === 'asc' ? a-b : b-a); const first = [], second = []; //this variable will later help in determining which array is to be reversed //and which one is to be concatenated to which //if length is even, it means that last element will go in second array //otherwise it will go in first array const isEven = arr.length % 2 === 0; for (let i = 0; i < arr.length; i++){ if(i % 2 === 0){ isEven ? first.push(arr[i]) : first.unshift(arr[i]); continue; }; isEven ? second.unshift(arr[i]) : second.push(arr[i]); }; return isEven ? second.concat(first) : first.concat(second); }; console.log(butterflyShuffle(array)); console.log(butterflyShuffle(array, 'des'));
출력
콘솔의 출력은 -
[ 9, 7, 5, 3, 1, 0, 2, 4, 6, 8 ] [ 0, 2, 4, 6, 8, 9, 7, 5, 3, 1 ]