문제 소개
두 개의 2차원 배열을 인자로 받아, 두 배열이 서로 같은지 여부에 따라 불리언(true/false) 값을 반환하는 JavaScript 함수를 작성해 보겠습니다. 여기서 말하는 배열의 동등함은 대응되는 요소들이 모두 일치한다는 의미입니다.
배열이 같다고 판단되는 조건
두 배열이 같으려면 먼저 행과 열의 개수가 동일해야 합니다. 그리고 모든 i(0 ≤ i < 행의 개수)와 j(0 ≤ j < 열의 개수)에 대해 arr1[i][j] === arr2[i][j]가 성립해야 합니다.
예제 코드
const arr1 = [
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
];
const arr2 = [
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
];
const areEqual = (first, second) => {
const { length: l1 } = first;
const { length: l2 } = second;
if (l1 !== l2) {
return false;
}
for (let i = 0; i < l1; i++) {
for (let j = 0; j < first[i].length; j++) {
if (first[i][j] !== second[i][j]) {
return false;
}
}
}
return true;
};
console.log(areEqual(arr1, arr2));
실행 결과
콘솔에는 다음과 같이 출력됩니다.
true
코드 설명
areEqual 함수는 구조 분해 할당으로 두 배열의 길이(행의 개수)를 꺼낸 뒤, 길이가 다르면 즉시 false를 반환합니다. 이후 중첩 for 루프를 돌며 같은 위치의 요소를 엄격 일치 연산자(===)로 비교하고, 하나라도 다르면 바로 false를 반환해 불필요한 순회를 줄입니다. 모든 요소가 일치하면 최종적으로 true를 반환합니다.
every()를 활용한 더 간결한 방법
Array.prototype.every() 메서드를 사용하면 같은 로직을 훨씬 선언적으로 표현할 수 있습니다.
const areEqual = (a, b) =>
a.length === b.length &&
a.every((row, i) =>
row.length === b[i].length &&
row.every((val, j) => val === b[i][j])
);
이 방식은 각 행의 길이까지 함께 검사하기 때문에, 행마다 열 개수가 다른 비정형 배열(ragged array)도 안전하게 처리할 수 있다는 장점이 있습니다.