두 개의 숫자 배열을 인수로 받아 서로 같은지 검사하는 자바스크립트 함수를 작성해야 한다고 가정해 보겠습니다.
여기서 말하는 '같음'은 다음 두 조건 중 하나를 만족하는 경우로 정의합니다.
두 배열에 담긴 요소가 순서와 관계없이 완전히 동일한 경우
첫 번째 배열의 모든 요소 합과 두 번째 배열의 모든 요소 합이 같은 경우
예를 들어 다음과 같습니다.
[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
코드 설명
위 코드의 동작 방식을 단계별로 살펴보면 다음과 같습니다.
합 우선 검사: reduce() 메서드로 각 배열의 요소 합을 구한 뒤, 두 합이 같다면 정의된 조건 중 하나를 만족하므로 즉시 true를 반환합니다.
요소별 비교: 합이 다른 경우, 원본 배열을 보호하기 위해 slice()로 복사본을 만들고, 첫 번째 배열의 각 요소가 두 번째 배열에 존재하는지 indexOf()로 확인합니다.
중복 처리: 매칭에 성공한 요소는 splice()로 제거함으로써, 같은 값이 여러 번 나타나는 경우에도 정확하게 비교할 수 있습니다.
이처럼 합 비교를 먼저 수행하면 많은 경우 빠르게 결과를 얻을 수 있고, 합이 다를 때에만 요소 단위 비교를 진행하므로 불필요한 연산을 줄일 수 있다는 장점이 있습니다.