문제 소개
JavaScript에서 배열 전체가 아닌 특정 인덱스 범위에 해당하는 부분만 정렬해야 하는 경우가 있습니다. 이번 글에서는 문자열 배열과 시작 인덱스, 끝 인덱스를 인수로 받아, 지정된 범위 안의 요소만 정렬하고 나머지 요소는 그대로 유지하는 함수를 작성해 보겠습니다.
요구 사항
작성할 함수는 다음 세 가지 인수를 받습니다.
- 첫 번째 인수: 문자열 배열
- 두 번째 인수: 정렬을 시작할 인덱스(start)
- 세 번째 인수: 정렬을 끝낼 인덱스(end)
start와 end 사이에 있는 요소들만 정렬하고, 그 외의 요소들은 원래 위치와 순서를 그대로 유지해야 합니다.
예시
const arr = ['z', 'b', 'a']; sortBetween(arr, 0, 1);
위 코드는 0번 인덱스와 1번 인덱스의 요소만 정렬해야 하며, 기대하는 결과는 다음과 같습니다.
const output = ['b', 'z', 'a'];
구현 방법
splice() 메서드를 활용하면 간단하게 해결할 수 있습니다. 먼저 정렬할 부분을 배열에서 잘라내고, 그 부분만 정렬한 뒤 원래 자리에 다시 삽입하는 방식입니다.
const arr = ['z', 'b', 'a'];
const sortBetween = (arr = [], start, end) => {
const part = arr.splice(start, end - start + 1);
part.sort();
arr.splice(start, 0, ...part);
}
sortBetween(arr, 0, 1);
console.log(arr);
코드 설명
arr.splice(start, end - start + 1): start 인덱스부터 end 인덱스까지의 요소를 잘라내어 새로운 배열 part에 저장합니다. 잘라낼 개수가 end - start + 1인 이유는 양 끝 인덱스를 모두 포함해야 하기 때문입니다.part.sort(): 잘라낸 부분 배열만 정렬합니다.arr.splice(start, 0, ...part): 정렬된 요소들을 원래 시작 위치에 다시 삽입합니다. 삭제 개수를 0으로 지정했기 때문에 기존 요소는 제거되지 않고 그대로 유지됩니다.
실행 결과
콘솔에는 다음과 같은 결과가 출력됩니다.
[ 'b', 'z', 'a' ]
0번과 1번 인덱스의 요소('z'와 'b')만 정렬되어 'b', 'z' 순서로 바뀌었고, 2번 인덱스의 'a'는 그대로 유지된 것을 확인할 수 있습니다. 이처럼 splice()와 sort()를 조합하면 배열의 일부 구간만 손쉽게 정렬할 수 있습니다.