sort 메서드를 이용한 배열 섞기?

Park, Jinyong·2020년 4월 7일
0

Small, but Valuable.

목록 보기
4/19

How to randomize a JavaScript array? (Stack overflow)

JavaScript에서 배열의 순서를 섞을 때 가장 좋은 방법은 무엇일까?

가장 많은 추천 수를 받은 배열 랜덤화 방법은 당연히 temp 변수를 만들어서 두 개의 elements를 swap하고 그것을 반복하는 것이다. 그 와중에 ES6 문법을 이용하여 두 개의 변수를 한 번에 swap하는 방식으로 temp 변수를 만들지 않아도 되는 방법이 있어서 흥미로웠다.

그리고 그 바로 아래, sort 메서드를 이용해 배열을 섞을 수 있는 방법으로 소개된 코드가 있다.
굉장히 깔끔해서 놀랐지만 대문짝만하게 박혀 있는 Warning! 문구가 눈길을 사로잡았다.

Warning!
The use of this algorithm is not recommended, because it is inefficient and strongly biased; see comments. It is being left here for future reference, because the idea is not that rare.

대충 엄청 비효율적이니까 추천하지 않는다는 말이다. 이 답글의 댓글에 '이 알고리즘을 10000번 수행해서 0번째 인덱스의 값을 추출해 그 비율을 확인해보면 알거야.' 라고 말해서, 즉시 확인해보니 아래와 같은 결과가 나왔다.

// 두 elements를 swap하는 방법
{ '1': 1992, '2': 2010, '3': 2011, '4': 1987, '5': 1995 }

// sort 메서드를 이용한 방법
{ '1': 3082, '2': 1260, '3': 1700, '4': 2229, '5': 1724 }

확실히 sort 메서드를 이용한 방법으로는 배열이 완전히 뒤섞이지 않은 것을 확인할 수 있다. 코드는 깔끔하지만 분명 문제가 있어보인다. 정확히는 모르겠지만, sort 내부에서 순서를 바꾸는 과정이 얼마나 반복되는지 확인할 방법이 없으므로 sort 메서드를 이용하는 방법은 좋은 방법이 아닌 것으로 생각된다. 그러니까, 일단 배열을 효율적으로 섞고 싶고 코드를 깔끔하게 작성하고 싶으면 swap 방식을 선택하되, ES6를 사용해보는 것이 좋을 것이다!

0개의 댓글