두 개의 배열을 입력받아 각 배열의 요소를 번갈아가며 하나의 새로운 배열로 병합하는 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 mergeAlernatively = (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(mergeAlernatively(arr1, arr2));출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
[ 4, 2, 3, 1, 2, 6, 5, 8, 6, 9, 8, 4, 9, 3 ]
코드 동작 원리
이 함수의 핵심 로직은 다음과 같습니다.
- 반복문은 두 배열 길이의 합만큼 실행됩니다.
- 인덱스
i가 짝수일 때는 첫 번째 배열(arr1)에서i / 2번째 요소를 가져옵니다. - 인덱스
i가 홀수일 때는 두 번째 배열(arr2)에서(i - 1) / 2번째 요소를 가져옵니다.
이러한 방식으로 짝수 자리에는 arr1의 요소가, 홀수 자리에는 arr2의 요소가 차례로 배치되어 두 배열이 자연스럽게 교차 병합됩니다.
참고: 길이가 다른 배열 처리하기
위 구현은 두 배열의 길이가 같을 때를 기준으로 동작합니다. 만약 두 배열의 길이가 다르다면, 더 긴 배열의 일부 요소가 undefined로 채워지거나 누락될 수 있습니다. 이 경우 아래와 같이 조건 검사를 추가하면 안전하게 처리할 수 있습니다.
const mergeAlternatively = (arr1, arr2) => {
const res = [];
const maxLen = Math.max(arr1.length, arr2.length);
for(let i = 0; i < maxLen; i++){
if(i < arr1.length){
res.push(arr1[i]);
}
if(i < arr2.length){
res.push(arr2[i]);
};
};
return res;
};이 버전은 각 인덱스에서 해당 배열에 요소가 존재하는 경우에만 값을 추가하므로, 길이가 서로 다른 배열도 오류 없이 병합할 수 있습니다.