JavaScript를 사용하다 보면 두 배열이 순서와 상관없이 동일한 요소를 담고 있는지 확인해야 하는 경우가 자주 있습니다.
문제 정의
예를 들어 다음과 같은 두 개의 숫자 배열이 있다고 가정해 보겠습니다.
[2, 4, 6, 7, 1] [4, 1, 7, 6, 2]
두 배열은 요소의 순서는 다르지만, 실제로 포함하고 있는 값은 완전히 동일합니다. 이처럼 순서에 관계없이 두 배열이 같은 요소들을 가지고 있는지 판별하여 불리언(Boolean) 값을 반환하는 함수를 작성해야 합니다.
즉, [2, 4, 6, 7, 1]과 [4, 1, 7, 6, 2]를 비교하면 요소 구성이 같으므로 true가 반환되어야 합니다.
구현 코드
이제 이러한 로직을 수행하는 함수를 작성해 보겠습니다. 핵심 아이디어는 다음과 같습니다.
- 먼저 두 배열의 길이(length)를 비교하여 다르면 즉시
false를 반환합니다. - 길이가 같다면 첫 번째 배열의 각 요소가 두 번째 배열에 존재하는지
includes()메서드로 확인합니다. - 존재하지 않는 요소가 하나라도 있으면
false, 모두 통과하면true를 반환합니다.
const first = [2, 4, 6, 7, 1];
const second = [4, 1, 7, 6, 2];
const areEqual = (first, second) => {
// 길이가 다르면 같은 배열일 수 없음
if(first.length !== second.length){
return false;
};
// first의 모든 요소가 second에 포함되어 있는지 검사
for(let i = 0; i < first.length; i++){
if(!second.includes(first[i])){
return false;
};
};
return true;
};
console.log(areEqual(first, second));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
true
참고 사항
이 방식은 직관적이지만, includes()는 내부적으로 배열을 순회하기 때문에 시간 복잡도가 O(n²)에 가깝습니다. 배열의 크기가 매우 큰 경우에는 두 배열을 먼저 정렬한 뒤(sort()) 요소를 하나씩 비교하거나, Map 객체로 요소의 빈도수를 세어 비교하는 방식(O(n))을 고려하는 것이 좋습니다.