교차 셔플(Alternative Shuffle)이란?
JavaScript에서 교차 셔플된 배열이란, 요소들이 가장 큰 숫자 다음에 가장 작은 숫자, 두 번째로 큰 숫자 다음에 두 번째로 작은 숫자가 오는 방식으로 번갈아 배치된 숫자 배열을 의미합니다.
예를 들어 입력 배열이 다음과 같다고 가정해 보겠습니다.
const arr = [11, 7, 9, 3, 5, 1, 13];
이 경우 기대되는 출력 결과는 다음과 같습니다.
const output = [13, 1, 11, 3, 9, 5, 7];
출력 배열을 자세히 보면 13(최댓값) → 1(최솟값) → 11(두 번째로 큰 값) → 3(두 번째로 작은 값) → … 순서로 교차 배치되어 있는 것을 확인할 수 있습니다.
구현 코드
다음은 위 로직을 JavaScript로 구현한 전체 코드입니다.
const arr = [11, 7, 9, 3, 5, 1, 13];
const sorter = (a, b) => a - b;
const alternateShuffle = (arr) => {
const array = arr
.slice()
.sort(sorter);
array.sort((a, b) => a-b);
for(let start = 0; start < array.length; start += 2){
array.splice(start, 0, array.pop());
}
return array;
};
console.log(alternateShuffle(arr));코드 동작 원리
- 배열 정렬:
slice()메서드로 원본 배열을 복사한 뒤 오름차순으로 정렬하여, 원본 데이터는 그대로 유지합니다. - 요소 재배치:
for루프에서 인덱스 0부터 시작해 2칸씩 건너뛰며, 매번 배열의 마지막 요소(남아 있는 값 중 최댓값)를pop()으로 꺼낸 후 현재 위치에splice()로 삽입합니다. - 결과 반환: 이 과정을 반복하면 최댓값과 최솟값이 번갈아 배치된 새로운 배열이 완성됩니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[ 13, 1, 11, 3, 9, 5, 7 ]
이처럼 sort(), pop(), splice() 세 가지 배열 메서드만 활용하면 별도의 임시 배열 없이도 간결하게 교차 셔플을 구현할 수 있습니다.