문제 상황
사람들의 나이를 담고 있는 숫자 배열이 주어졌을 때, 18세 미만(미성년자)의 나이를 모두 배열의 앞쪽으로 옮기는 JavaScript 함수를 작성해야 합니다. 이때 새로운 배열을 만드는 등 추가 메모리를 사용하지 않고 기존 배열 자체를 정렬해야 한다는 조건이 있습니다.
해결 방법
JavaScript의 Array.prototype.sort() 메서드는 비교 함수(comparator)를 인자로 받을 수 있습니다. 비교 함수는 두 요소 a와 b를 비교하여 정렬 순서를 결정하며, 동작 방식은 다음과 같습니다.
- 반환값이 음수(-1)이면 a가 b보다 앞에 위치합니다.
- 반환값이 양수(1)이면 b가 a보다 앞에 위치합니다.
- 반환값이 0이면 순서가 유지됩니다.
따라서 값이 18 미만일 때 -1을 반환하고, 그렇지 않으면 1 또는 0을 반환하도록 비교 함수를 작성하면 미성년자의 나이가 자연스럽게 배열 앞쪽으로 정렬됩니다.
예제 코드
이를 구현한 코드는 다음과 같습니다 −
const ages = [23, 56, 56, 3, 67, 8, 4, 34, 23, 12, 67, 16, 47];
const sorter = (a, b) => {
if (a < 18) {
return -1;
};
if (b < 18) {
return 1;
};
return 0;
}
const sortByAdults = arr => {
arr.sort(sorter);
};
sortByAdults(ages);
console.log(ages);
실행 결과
콘솔 출력 결과는 다음과 같습니다 −
[
16, 12, 4, 8, 3, 23, 56,
56, 67, 34, 23, 67, 47
]
코드 설명
위 코드에서 sorter 비교 함수는 첫 번째 인자 a가 18 미만일 때 -1을 반환하여 해당 값을 앞으로 보내고, 두 번째 인자 b가 18 미만일 때 1을 반환하여 b를 앞으로 배치합니다. sort() 메서드는 원본 배열을 직접 수정(in-place)하기 때문에 별도의 추가 메모리 없이도 요구 조건을 충족할 수 있습니다. 참고로 18세 이상의 값들 사이에서는 상대적인 순서가 보장되지 않으므로, 성인 간의 원래 순서를 유지해야 한다면 안정 정렬(stable sort) 로직을 추가로 고려해야 합니다.