이번 글에서는 리터럴 값으로 이루어진 배열을 유일한 인수로 받는 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칸씩 전진하면서 현재 위치
i와i+2(짝수 인덱스끼리), 그리고i+1과i+3(홀수 인덱스끼리)을 교환합니다. - 루프 종료 후 남은 요소가 있다면 마지막으로 짝수 인덱스 쌍 하나만 추가로 교환하여 홀수 개수 배열도 올바르게 처리합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
[
2, 3, 0, 1, 6,
7, 4, 5, 8
]기대했던 대로 짝수 인덱스와 홀수 인덱스의 요소들이 각각 제자리에서 성공적으로 교환된 것을 확인할 수 있습니다. 이 알고리즘은 배열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 배열을 생성하지 않아 공간 복잡도는 O(1)입니다.