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

JavaScript에서 배열의 특정 구간만 뒤집는 방법

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 메서드만으로 간결하게 해결할 수 있으며, 배열의 다른 영역에는 영향을 주지 않으면서 원하는 구간만 조작할 수 있다는 장점이 있습니다.