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

자바스크립트로 두 배열의 동등성 확인하기 — 요소 구성과 합 기준 비교

두 개의 숫자 배열을 인수로 받아 서로 같은지 검사하는 자바스크립트 함수를 작성해야 한다고 가정해 보겠습니다.

여기서 말하는 '같음'은 다음 두 조건 중 하나를 만족하는 경우로 정의합니다.

  • 두 배열에 담긴 요소가 순서와 관계없이 완전히 동일한 경우

  • 첫 번째 배열의 모든 요소 합과 두 번째 배열의 모든 요소 합이 같은 경우

예를 들어 다음과 같습니다.

[3, 5, 6, 7, 7]과 [7, 5, 3, 7, 6]은 같은 배열입니다.
[1, 2, 3, 1, 2]와 [7, 2]도 합이 9로 같으므로 같은 배열입니다.
하지만 [3, 4, 2, 5]와 [2, 3, 1, 4]는 합도 다르고 구성 요소도 달라 같지 않습니다.

구현 예제

const first = [3, 5, 6, 7, 7];
const second = [7, 5, 3, 7, 6];

const isEqual = (first, second) => {
   // 각 배열의 요소 합을 계산합니다.
   const sumFirst = first.reduce((acc, val) => acc + val);
   const sumSecond = second.reduce((acc, val) => acc + val);

   // 합이 같다면 즉시 true를 반환합니다.
   if(sumFirst === sumSecond){
      return true;
   };

   // 원본 배열을 변경하지 않도록 복사본을 생성합니다.
   const firstCopy = first.slice();
   const secondCopy = second.slice();

   // 첫 번째 배열의 각 요소가 두 번째 배열에 존재하는지 확인합니다.
   for(let i = 0; i < firstCopy.length; i++){
      const ind = secondCopy.indexOf(firstCopy[i]);
      if(ind === -1){
         return false;
      };
      // 매칭된 요소는 제거하여 중복 값을 올바르게 처리합니다.
      secondCopy.splice(ind, 1);
   };
   return true;
};

console.log(isEqual(first, second));

출력 결과

콘솔에는 다음과 같은 결과가 출력됩니다.

true

코드 설명

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

  1. 합 우선 검사: reduce() 메서드로 각 배열의 요소 합을 구한 뒤, 두 합이 같다면 정의된 조건 중 하나를 만족하므로 즉시 true를 반환합니다.

  2. 요소별 비교: 합이 다른 경우, 원본 배열을 보호하기 위해 slice()로 복사본을 만들고, 첫 번째 배열의 각 요소가 두 번째 배열에 존재하는지 indexOf()로 확인합니다.

  3. 중복 처리: 매칭에 성공한 요소는 splice()로 제거함으로써, 같은 값이 여러 번 나타나는 경우에도 정확하게 비교할 수 있습니다.

이처럼 합 비교를 먼저 수행하면 많은 경우 빠르게 결과를 얻을 수 있고, 합이 다를 때에만 요소 단위 비교를 진행하므로 불필요한 연산을 줄일 수 있다는 장점이 있습니다.