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

JavaScript로 배열의 짝수·홀수 인덱스 요소를 제자리에서 교환하는 방법

이번 글에서는 리터럴 값으로 이루어진 배열을 유일한 인수로 받는 JavaScript 함수를 작성해 보겠습니다.

이 함수가 해야 할 일은 다음과 같습니다. 배열에서 연속된 짝수 인덱스끼리 서로 교환하고, 연속된 홀수 인덱스끼리 서로 교환하는 것입니다. 단, 이 모든 교환 작업은 새로운 배열을 만들지 않고 제자리(in-place)에서 수행되어야 합니다.

동작 예시

예를 들어 입력 배열이 다음과 같다고 가정해 봅시다.

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];

함수 실행 후 배열은 아래와 같이 변해야 합니다.

const output = [2, 3, 0, 1, 6, 7, 4, 5, 8];

그 이유는 다음과 같습니다.

  • 인덱스 0의 값(0)과 인덱스 2의 값(2)이 교환됨
  • 인덱스 1의 값(1)과 인덱스 3의 값(3)이 교환됨
  • 인덱스 4의 값(4)과 인덱스 6의 값(6)이 교환됨
  • 인덱스 5의 값(5)과 인덱스 7의 값(7)이 교환됨
  • 마지막 인덱스 8의 값(8)은 교환할 짝이 없으므로 그대로 유지됨

구현 코드

위 로직을 구현한 코드는 다음과 같습니다.

const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
const swapPairs = (arr = []) => {
    const swap = (array, ind1, ind2) => {
        const temp = array[ind1];
        arr[ind1] = arr[ind2];
        arr[ind2] = temp;
    };
    let i = 0;
    for(; i + 3 < arr.length; i += 4){
        swap(arr, i, i + 2);
        swap(arr, i + 1, i + 3);
    };
    if (i + 2 < arr.length){
        swap(arr, i, i + 2);
    };
};
swapPairs(arr);
console.log(arr);

코드 설명

핵심 로직을 간단히 살펴보면 다음과 같습니다.

  • swap 헬퍼 함수는 임시 변수(temp)를 사용해 두 인덱스의 값을 안전하게 맞바꿉니다.
  • 메인 루프는 한 번에 4칸씩 전진하면서 현재 위치 ii+2(짝수 인덱스끼리), 그리고 i+1i+3(홀수 인덱스끼리)을 교환합니다.
  • 루프 종료 후 남은 요소가 있다면 마지막으로 짝수 인덱스 쌍 하나만 추가로 교환하여 홀수 개수 배열도 올바르게 처리합니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

[
    2, 3, 0, 1, 6,
    7, 4, 5, 8
]

기대했던 대로 짝수 인덱스와 홀수 인덱스의 요소들이 각각 제자리에서 성공적으로 교환된 것을 확인할 수 있습니다. 이 알고리즘은 배열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 배열을 생성하지 않아 공간 복잡도는 O(1)입니다.