문제 소개
두 개의 배열을 인수로 전달받아, 각 배열에서 요소를 하나씩 번갈아 가져와 새로운 배열 하나로 병합하는 JavaScript 함수를 작성해야 합니다.
예시
입력 배열이 다음과 같다고 가정해 보겠습니다.
const arr1 = [4, 3, 2, 5, 6, 8, 9];
const arr2 = [2, 1, 6, 8, 9, 4, 3];
이 경우 기대하는 출력 결과는 다음과 같습니다.
const output = [4, 2, 3, 1, 2, 6, 5, 8, 6, 9, 8, 4, 9, 3];
즉, 첫 번째 배열의 요소와 두 번째 배열의 요소가 한 개씩 교대로 배치된 형태입니다.
구현 코드
위 조건을 만족하는 함수의 코드는 다음과 같습니다.
const arr1 = [4, 3, 2, 5, 6, 8, 9];
const arr2 = [2, 1, 6, 8, 9, 4, 3];
const mergeAlternatively = (arr1, arr2) => {
const res = [];
for(let i = 0; i < arr1.length + arr2.length; i++){
if(i % 2 === 0){
res.push(arr1[i / 2]);
}else{
res.push(arr2[(i - 1) / 2]);
}
}
return res;
};
console.log(mergeAlternatively(arr1, arr2));
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[
4, 2, 3, 1, 2, 6,
5, 8, 6, 9, 8, 4,
9, 3
]
코드 동작 원리
이 함수의 핵심은 반복문의 인덱스 i를 활용해 두 배열을 오가며 값을 꺼내는 것입니다.
- i가 짝수일 때(0, 2, 4...)는 arr1[i / 2]를 사용해 첫 번째 배열의 요소를 순서대로 추가합니다.
- i가 홀수일 때(1, 3, 5...)는 arr2[(i - 1) / 2]를 사용해 두 번째 배열의 요소를 순서대로 추가합니다.
반복문은 두 배열 길이의 합만큼 실행되므로, 최종적으로 모든 요소가 교대로 배치된 새로운 배열이 완성됩니다. 시간 복잡도는 O(n + m)(n, m은 각 배열의 길이)로 매우 효율적입니다.
다만 위 코드는 두 배열의 길이가 같거나 비슷할 때 가장 자연스럽게 동작하며, 길이가 크게 다른 배열에는 undefined 값이 포함될 수 있으므로 실무에서는 길이 차이를 처리하는 로직을 함께 고려하는 것이 좋습니다.