javascirpt 배열을 무작위로 섞는 방법

작성일 :

JavaScript 배열을 무작위로 섞는 방법

JavaScript에서 배열을 무작위로 섞어야 하는 상황은 생각보다 자주 발생합니다. 예를 들어, 카드 게임을 만들거나, 랜덤 퀴즈를 생성할 때 등 다양한 경우에서 필요합니다. 이번 글에서는 이러한 문제를 해결할 수 있는 여러 가지 방법을 설명하고, 그 중 가장 효율적인 방법인 Fisher-Yates 알고리즘도 알아보겠습니다.

Fisher-Yates 알고리즘

JavaScript 배열을 무작위로 섞는 가장 잘 알려진 방법은 Fisher-Yates 알고리즘입니다. 이 알고리즘은 O(n) 성능을 가지며, 각 항목이 동등하게 섞일 확률을 보장합니다. 다음은 Fisher-Yates 알고리즘을 사용한 예제입니다.

javascript
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]]; // 두 요소를 스왑합니다.
  }
  return array;
}

const sampleArray = [1, 2, 3, 4, 5];
console.log(shuffleArray(sampleArray));

이 코드는 배열의 끝에서부터 시작하여, 무작위로 선택된 요소와 현재 요소를 교체하면서 배열을 섞습니다.

장점

  1. 효율적입니다. 시간 복잡도가 O(n)입니다.
  2. 각 요소가 동등하게 섞일 확률이 있습니다.

단점

  1. 별다른 단점이 없습니다. 매우 일반적으로 사용하는 알고리즘입니다.

단순 정렬 방법

가장 간단한 방법 중 하나는 Array.sort 메서드에 무작위 값을 반환하는 비교 함수를 전달하는 것입니다. 이 방법은 사용하기는 매우 간단하지만, Fisher-Yates 알고리즘처럼 효율적이지 않을 수 있습니다.

javascript
function shuffleArraySimple(array) {
  return array.sort(() => Math.random() - 0.5);
}

const sampleArray = [1, 2, 3, 4, 5];
console.log(shuffleArraySimple(sampleArray));

이 방법은 배열을 비교함수를 사용하여 정렬하지만, 성능이 좋지 않다는 문제가 있습니다. 즉, O(n log n) 시간 복잡도를 가집니다.

장점

  1. 코드가 매우 간단하고 직관적입니다.
  2. 간단한 용도에서 빠르게 사용할 수 있습니다.

단점

  1. 시간 복잡도가 O(n log n)으로 비효율적입니다.
  2. 각 요소가 동등하게 섞일 확률을 보장하지 않습니다.

Lodash 라이브러리 사용

만약 라이브러리를 사용하는 것을 선호한다면, Lodash의 shuffle 함수를 사용할 수 있습니다. Lodash는 다양한 유틸리티 함수를 제공하는 라이브러리로, 배열을 무작위로 섞는 기능도 포함되어 있습니다.

javascript
const _ = require('lodash');

const sampleArray = [1, 2, 3, 4, 5];
console.log(_.shuffle(sampleArray));

Lodash의 shuffle 함수는 내부적으로 Fisher-Yates 알고리즘을 사용하여 배열을 무작위로 섞습니다.

장점

  1. 라이브러리를 사용하면 간단하고 직관적입니다.
  2. 이미 라이브러리를 사용하고 있는 경우 추가적인 코드 작성이 필요 없습니다.

단점

  1. 외부 라이브러리에 의존한다는 단점이 있습니다.
  2. 프로젝트의 크기가 커질 수 있습니다.

결론

JavaScript에서 배열을 무작위로 섞는 여러 가지 방법에 대해 알아보았습니다. 가장 효율적이고 흔히 사용되는 방법은 Fisher-Yates 알고리즘이며, 간단한 구현 방법으로는 Array.sort를 사용할 수 있습니다. 만약 외부 라이브러리를 사용하는 것이 가능하다면 Lodash를 활용하는 방법도 좋은 선택이 될 수 있습니다.

어떤 방법을 사용하든지 간에, 여러분의 필요와 상황에 맞는 최적의 방법을 선택하여 사용하시기 바랍니다. 배열을 무작위로 섞는 것은 알고리즘 공부에도 좋은 주제가 되니, 직접 구현하며 연습해보는 것도 좋은 방법입니다.