문제 소개
두 개의 숫자 배열 arr1과 arr2를 각각 첫 번째, 두 번째 인수로 받아 처리하는 JavaScript 함수를 작성해야 합니다.
이 함수의 역할은 두 배열의 요소를 하나의 새로운 배열로 병합하는 것입니다. 이때 병합 전이나 병합 과정에서 중복된 값이 발견되면 나머지 중복 항목은 모두 제거하여, 각 요소가 최종 배열에 정확히 한 번만 존재하도록 만들어야 합니다.
요소들의 순서는 크게 중요하지 않지만, 모든 요소의 등장 빈도가 반드시 1이 되어야 한다는 점이 핵심입니다.
예를 들어, 함수에 다음과 같은 입력이 주어졌다고 가정해 보겠습니다.
const arr1 = [6, 5, 2, 1, 8];
const arr2 = [3, 4, 6, 8, 9];
두 배열에는 6과 8이 공통으로 포함되어 있으므로, 기대하는 출력 결과는 다음과 같습니다.
const output = [6, 5, 2, 1, 8, 3, 4, 9];
예제 코드
다음은 위 문제를 해결하는 코드입니다.
const arr1 = [6, 5, 2, 1, 8];
const arr2 = [3, 4, 6, 8, 9];
const mergeAndRectify = (arr1 = [], arr2 = []) => {
const res = [];
for (const num of [...arr1, ...arr2]) {
if (!res.includes(num)) {
res.push(num);
}
}
return res;
};
console.log(mergeAndRectify(arr1, arr2));
코드 설명
- 전개 연산자(...)를 사용해 두 배열을 하나의 배열로 합칩니다.
- 결과 배열 res에 아직 존재하지 않는 값일 때만 push()하여 중복 추가를 방지합니다.
- includes() 메서드는 배열에 특정 값이 이미 들어 있는지 확인하는 데 사용됩니다.
출력 결과
콘솔 출력 결과는 다음과 같습니다.
[ 6, 5, 2, 1, 8, 3, 4, 9 ]
더 간단한 방법: Set 활용하기
ES6에서 도입된 Set 객체를 사용하면 중복 제거 로직을 훨씬 더 간결하게 작성할 수 있습니다.
const mergeAndRectify = (arr1 = [], arr2 = []) => [...new Set([...arr1, ...arr2])];
console.log(mergeAndRectify([6, 5, 2, 1, 8], [3, 4, 6, 8, 9]));
// [ 6, 5, 2, 1, 8, 3, 4, 9 ]
Set은 중복 값을 허용하지 않는 자료구조이므로, 병합된 배열을 Set으로 변환한 뒤 다시 배열로 펼치기만 하면 됩니다. 배열이 클수록 includes()를 반복 호출하는 방식(O(n²))보다 Set 기반 접근(O(n))이 성능 면에서 훨씬 유리합니다.