Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 교차 셔플(Alternative Shuffle) 알고리즘 구현하기

교차 셔플(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));

코드 동작 원리

  1. 배열 정렬: slice() 메서드로 원본 배열을 복사한 뒤 오름차순으로 정렬하여, 원본 데이터는 그대로 유지합니다.
  2. 요소 재배치: for 루프에서 인덱스 0부터 시작해 2칸씩 건너뛰며, 매번 배열의 마지막 요소(남아 있는 값 중 최댓값)를 pop()으로 꺼낸 후 현재 위치에 splice()로 삽입합니다.
  3. 결과 반환: 이 과정을 반복하면 최댓값과 최솟값이 번갈아 배치된 새로운 배열이 완성됩니다.

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

[
    13, 1, 11, 3,
    9, 5,  7
]

이처럼 sort(), pop(), splice() 세 가지 배열 메서드만 활용하면 별도의 임시 배열 없이도 간결하게 교차 셔플을 구현할 수 있습니다.