이번 글에서는 숫자 배열을 입력받아 짝수는 모두 먼저 오름차순으로, 그다음 홀수도 오름차순으로 정렬하는 JavaScript 함수를 작성해 보겠습니다.
문제 이해하기
예를 들어, 다음과 같은 배열이 입력으로 주어졌다고 가정해 봅시다.
const arr = [2, 5, 2, 6, 7, 1, 8, 9];
기대 출력 결과
위 배열을 조건에 맞게 정렬하면 아래와 같은 결과가 나와야 합니다.
const output = [2, 2, 6, 8, 1, 5, 7, 9];
즉, 짝수인 2, 2, 6, 8이 앞쪽에 오름차순으로 배치되고, 홀수인 1, 5, 7, 9가 뒤쪽에 오름차순으로 배치됩니다.
해결 방법: 커스텀 비교 함수 활용
JavaScript의 Array.prototype.sort() 메서드는 비교 함수(comparator)를 인자로 받을 수 있습니다. 이 비교 함수 안에서 두 요소의 짝수·홀수 여부를 판단하여 정렬 우선순위를 결정하면 됩니다.
정렬 로직은 다음과 같습니다.
- a가 짝수이고 b가 홀수라면 → a가 먼저 와야 하므로 -1 반환
- a가 홀수이고 b가 짝수라면 → b가 먼저 와야 하므로 1 반환
- 둘 다 같은 타입(짝수-짝수 또는 홀수-홀수)이라면 → 일반적인 숫자 비교(a - b)로 오름차순 정렬
구현 코드
const arr = [2, 5, 2, 6, 7, 1, 8, 9];
// 짝수 여부를 판별하는 헬퍼 함수
const isEven = num => num % 2 === 0;
// 커스텀 비교 함수
const sorter = (a, b) => {
if (isEven(a) && !isEven(b)) {
return -1; // a(짝수)가 b(홀수)보다 앞에 위치
}
if (!isEven(a) && isEven(b)) {
return 1; // a(홀수)가 b(짝수)보다 뒤에 위치
}
return a - b; // 같은 그룹 내에서는 오름차순 정렬
};
const oddEvenSort = arr => {
arr.sort(sorter);
};
oddEvenSort(arr);
console.log(arr);실행 결과
코드를 실행하면 콘솔에 다음과 같은 정렬된 배열이 출력됩니다.
[ 2, 2, 6, 8, 1, 5, 7, 9 ]
코드 설명 및 참고 사항
isEven 함수는 나머지 연산자(%)를 사용해 숫자를 2로 나눈 나머지가 0인지 확인함으로써 짝수 여부를 판별합니다. 음수가 포함된 배열에서도 -4 % 2 === 0처럼 동작하므로 정상적으로 작동합니다.
또한 JavaScript의 sort() 메서드는 기본적으로 원본 배열을 직접 수정(in-place)한다는 점을 기억하세요. 원본 배열을 유지하고 싶다면 [...arr].sort(sorter)처럼 스프레드 연산자로 복사본을 만든 후 정렬하는 것이 좋습니다.
이 방식의 시간 복잡도는 JavaScript 엔진이 사용하는 정렬 알고리즘(TimSort 등)에 따라 평균적으로 O(n log n)입니다.