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

JavaScript 배열 정렬: 짝수 먼저, 홀수 나중에 오름차순으로 정렬하기

이번 글에서는 숫자 배열을 입력받아 짝수는 모두 먼저 오름차순으로, 그다음 홀수도 오름차순으로 정렬하는 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)입니다.