JavaScript로 프로그래밍하다 보면 배열 전체가 아니라 특정 구간만 뒤집어야 하는 경우가 종종 있습니다. 예를 들어 알고리즘 문제 풀이나 데이터 가공 과정에서 배열의 일부 요소들만 순서를 반대로 바꿔야 할 때가 그렇습니다.
이번 글에서는 배열, 시작 인덱스(start index), 끝 인덱스(end index)를 매개변수로 받아 해당 범위의 요소들만 뒤집는 함수를 직접 구현해 보겠습니다.
문제 정의와 예시
예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.
const arr = [2, 6, 5, 8, 3, 5, 2, 6, 7];
여기서 시작 인덱스가 3, 끝 인덱스가 7이라면, 인덱스 3부터 7 사이의 요소인 [8, 3, 5, 2] 부분만 뒤집혀야 합니다. 따라서 최종 결과는 다음과 같습니다.
const output = [2, 6, 5, 2, 5, 3, 8, 6, 7];
앞뒤에 있는 요소들은 그대로 유지되고, 지정된 범위 안의 요소들만 순서가 반대로 바뀐 것을 확인할 수 있습니다.
구현 코드
이를 구현한 전체 코드는 다음과 같습니다.
const arr = [2, 6, 5, 8, 3, 5, 2, 6, 7];
const start = 3, end = 7;
// 배열 전체를 뒤집는 헬퍼 함수
const reverse = arr => {
const { length: l } = arr;
for(let i = 0; i < Math.floor(l/2); i++){
const temp = arr[i];
arr[i] = arr[l-i-1];
arr[l-i-1] = temp;
};
return arr;
};
// 특정 구간만 뒤집는 함수
const reverseBetween = (arr, start, end) => {
const num = Math.min(end - start, arr.length - start);
arr.splice(start, 0, ...reverse(arr.splice(start, num)));
}
reverseBetween(arr, start, end);
console.log(arr);코드 동작 원리
이 코드는 두 개의 함수로 나누어 작성되었습니다.
1. reverse 함수 — 배열 전체 뒤집기
reverse 함수는 전달받은 배열의 길이를 구한 뒤, 배열의 절반(Math.floor(l/2))만큼만 반복합니다. 각 반복마다 임시 변수 temp를 활용해 앞쪽 요소와 뒤쪽 요소의 자리를 서로 맞바꾸는 방식으로 배열 전체를 뒤집습니다.
2. reverseBetween 함수 — 원하는 구간만 잘라내어 뒤집기
reverseBetween 함수가 핵심 로직입니다.
Math.min(end - start, arr.length - start)를 통해 뒤집어야 할 요소의 개수를 계산합니다. 이렇게 하면 끝 인덱스가 배열 길이를 초과하더라도 안전하게 처리할 수 있습니다.arr.splice(start, num)으로 시작 인덱스부터 해당 개수만큼의 요소를 배열에서 잘라냅니다.- 잘라낸 배열을
reverse함수로 뒤집은 뒤,arr.splice(start, 0, ...)를 사용해 원래 위치(시작 인덱스)에 다시 삽입합니다. 이때 두 번째 인자가 0이므로 기존 요소를 삭제하지 않고 새 요소를 삽입하게 됩니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[
2, 6, 5, 2, 5,
3, 8, 6, 7
]인덱스 3부터 7까지의 요소들이 성공적으로 뒤집힌 것을 확인할 수 있습니다. 이 방식은 별도의 외부 라이브러리 없이 순수 JavaScript의 splice 메서드만으로 간결하게 해결할 수 있으며, 배열의 다른 영역에는 영향을 주지 않으면서 원하는 구간만 조작할 수 있다는 장점이 있습니다.