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

JavaScript로 세 배열의 공통 요소 합계 구하기

문제 정의

숫자로 이루어진 세 개의 배열을 입력받는 JavaScript 함수를 작성해야 합니다. 이 함수는 세 배열 모두에 공통으로 존재하는 요소들만 골라내어 그 합을 반환해야 합니다. 중복된 값이 있는 경우에는 각 배열에서 실제로 짝이 맺어지는 횟수만큼만 합산하는 것이 핵심입니다.

코드 예제

다음은 세 배열의 공통 요소 합을 구하는 전체 코드입니다.

const arr1 = [4, 4, 5, 8, 3];
const arr2 = [7, 3, 7, 4, 1];
const arr3 = [11, 0, 7, 3, 4];

const sumCommon = (arr1 = [], arr2 = [], arr3 = []) => {
    let sum = 0;
    for(let i = 0; i < arr1.length; i++){
        const el = arr1[i];
        const ind2 = arr2.indexOf(el);
        const ind3 = arr3.indexOf(el);
        if(ind2 !== -1 && ind3 !== -1){
            arr2.splice(ind2, 1);
            arr3.splice(ind3, 1);
            sum += el;
        }
    }
    return sum;
};

console.log(sumCommon(arr1, arr2, arr3));

출력 결과

7

동작 원리

위 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.

첫째, 첫 번째 배열(arr1)의 요소를 하나씩 순회합니다. 둘째, 현재 요소가 두 번째 배열과 세 번째 배열에 각각 존재하는지 indexOf()로 확인합니다. 인덱스가 -1이면 해당 배열에 요소가 없다는 의미입니다. 셋째, 세 배열 모두에 존재한다면 splice()를 사용해 두 번째와 세 번째 배열에서 해당 요소를 하나씩 제거한 뒤 합계에 더합니다.

예제에서 공통 요소는 4와 3이며, 따라서 출력 결과는 4 + 3 = 7이 됩니다. 첫 번째 배열에 4가 두 번 등장하지만, 두 번째 순회 시점에는 다른 배열에서 이미 4가 제거되었기 때문에 중복 계산되지 않습니다.

참고 사항

splice()는 원본 배열을 직접 수정하므로, 원본 데이터를 보존해야 하는 경우에는 배열을 복사한 뒤([...arr]) 함수 내부에서 사용하는 것이 안전합니다. 또한 배열 크기가 매우 클 경우 indexOf()의 반복 호출은 O(n²)에 가까운 성능을 보이므로, Set 객체를 활용하면 조회 속도를 크게 개선할 수 있습니다.