문제 상황
양수와 음수, 그리고 짝수와 홀수가 섞여 있는 숫자 배열이 있다고 가정해 보겠습니다. 이 배열을 오름차순으로 정렬하되, 다음 조건을 만족해야 합니다.
- 모든 짝수는 어떤 홀수보다도 앞에 위치해야 합니다.
- 짝수 그룹과 홀수 그룹 각각의 내부에서도 오름차순 정렬이 유지되어야 합니다.
예를 들어, 입력 배열이 다음과 같다면 −
const arr = [-2,3,6,-12,9,2,-4,-11,-8];
기대하는 출력 결과는 다음과 같습니다 −
[ -12, -8, -4, -2, 2, 6, -11, 3, 9]
해결 방법: 커스텀 비교 함수 활용
배열의 sort() 메서드에 커스텀 비교 함수(comparator)를 전달하면 이 문제를 깔끔하게 해결할 수 있습니다. 비교 함수의 동작 로직은 다음과 같습니다.
- 두 숫자 a와 b가 각각 짝수인지 판별합니다.
!(a % 2)는 나눗셈의 나머지가 0일 때 true를 반환합니다. - a가 짝수이고 b가 홀수라면 -1을 반환하여 a를 b보다 앞에 배치합니다.
- a가 홀수이고 b가 짝수라면 1을 반환하여 a를 b보다 뒤에 배치합니다.
- 두 수의 홀짝 여부가 같다면 일반적인 오름차순 비교 결과인
a - b를 반환합니다.
참고로 음수 짝수의 경우 자바스크립트에서 -12 % 2의 결과가 -0(falsy 값)이 되므로, 이 로직은 음수에 대해서도 정확하게 작동합니다.
예제 코드
const arr = [-2,3,6,-12,9,2,-4,-11,-8];
const sorter = (a, b) => {
const isAEven = !(a % 2);
const isBEven = !(b % 2);
if(isAEven && !isBEven){
return -1;
};
if(!isAEven && isBEven){
return 1;
};
return a - b;
};
arr.sort(sorter);
console.log(arr);실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
[ -12, -8, -4, -2, 2, 6, -11, 3, 9 ]
결과를 보면 짝수(-12, -8, -4, -2, 2, 6)가 먼저 오름차순으로 정렬되고, 그 뒤에 홀수(-11, 3, 9)가 오름차순으로 정렬된 것을 확인할 수 있습니다.