문제 개요
숫자 배열을 입력받아, 모든 짝수는 홀수보다 왼쪽에, 모든 홀수는 짝수보다 오른쪽에 위치하도록 재배열한 배열을 반환하는 JavaScript 함수를 작성해야 합니다.
이 문제는 별도의 새로운 알고리즘 없이도 Array.prototype.sort() 메서드에 사용자 정의 비교 함수(comparator)를 전달하는 방식으로 간단하게 해결할 수 있습니다.
해결 접근 방식
- 숫자가 짝수인지 판별하는 헬퍼 함수
isEven을 작성합니다. sort()메서드에 비교 함수를 전달합니다.- 첫 번째 요소
a가 짝수이고 두 번째 요소b가 홀수라면-1을 반환하여a를 앞쪽으로 보냅니다. a가 홀수이고b가 짝수라면1을 반환하여b를 앞쪽으로 보냅니다.- 두 요소가 모두 짝수이거나 모두 홀수라면
0을 반환하여 기존 순서를 유지합니다.
예제 코드
const arr = [2, 6, 3, 7, 8, 3, 5, 4, 3, 6, 87, 23, 2, 23, 67, 4];
const isEven = num => num % 2 === 0;
const sorter = (a, b) => {
if(isEven(a) && !isEven(b)){
return -1;
};
if(!isEven(a) && isEven(b)){
return 1;
};
return 0;
};
arr.sort(sorter);
console.log(arr);
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[
2, 6, 8, 4, 6, 2,
4, 3, 7, 3, 5, 3,
87, 23, 23, 67
]
참고 사항
출력 결과를 보면 짝수 그룹과 홀수 그룹 내부에서는 원래 배열의 상대적인 순서가 유지되는 것을 확인할 수 있습니다. 이는 ES2019(ES10)부터 자바스크립트 표준 명세에서 Array.prototype.sort()가 안정 정렬(stable sort)을 보장하기 때문입니다. 따라서 같은 그룹에 속한 요소들 사이의 원래 순서를 유지하고 싶다면 위 방식이 안전하게 동작합니다.