두 개의 배열이 주어졌을 때, 같은 인덱스에 위치한 값들이 몇 개나 일치하는지 세는 함수를 작성해야 하는 경우가 있습니다. 이때 중요한 조건은 비교가 순서에 의존적(sequence dependent)이라는 점입니다.
즉, 첫 번째 배열의 첫 번째 요소는 두 번째 배열의 첫 번째 요소와, 두 번째 요소는 두 번째 요소와 비교하는 식으로 인덱스가 서로 대응되는 값들만 비교합니다.
예시
다음과 같은 두 배열이 입력으로 주어진다고 가정해 보겠습니다.
const arr1 = [4, 7, 4, 3, 3, 3, 7, 6, 5]; const arr2 = [6, 5, 4, 5, 3, 2, 5, 7, 5];
두 배열을 인덱스별로 비교하면 다음과 같습니다.
- 인덱스 0: 4 vs 6 → 불일치
- 인덱스 1: 7 vs 5 → 불일치
- 인덱스 2: 4 vs 4 → 일치
- 인덱스 3: 3 vs 5 → 불일치
- 인덱스 4: 3 vs 3 → 일치
- 인덱스 5: 3 vs 2 → 불일치
- 인덱스 6: 7 vs 5 → 불일치
- 인덱스 7: 6 vs 7 → 불일치
- 인덱스 8: 5 vs 5 → 일치
따라서 이 경우 출력 결과는 3이 되어야 합니다.
for 반복문을 활용한 해결 방법
이 문제는 for 반복문을 사용하여 두 배열의 같은 인덱스에 있는 값을 하나씩 비교하면 간단하게 해결할 수 있습니다.
코드
const arr1 = [4, 7, 4, 3, 3, 3, 7, 6, 5];
const arr2 = [6, 5, 4, 5, 3, 2, 5, 7, 5];
const correspondingEquality = (arr1, arr2) => {
let res = 0;
for(let i = 0; i < arr1.length; i++){
if(arr1[i] !== arr2[i]){
continue;
};
res++;
};
return res;
};
console.log(correspondingEquality(arr1, arr2));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
3
filter()를 활용한 더 간결한 방법
for 반복문 대신 배열의 filter() 메서드를 활용하면 코드를 한 줄로 줄일 수 있습니다.
const correspondingEquality = (arr1, arr2) =>
arr1.filter((val, i) => val === arr2[i]).length;
console.log(correspondingEquality(arr1, arr2)); // 3filter()는 조건을 만족하는 요소만 모아 새로운 배열을 반환하므로, 그 길이를 구하면 곧 일치하는 요소의 개수가 됩니다.
정리
배열의 순서를 고려하여 요소 일치 여부를 확인할 때는 인덱스를 기준으로 두 배열을 나란히 비교하는 것이 핵심입니다. 단순 반복문이든 filter()든, 시간 복잡도는 O(n)으로 동일하므로 상황에 맞게 가독성 좋은 방식을 선택하면 됩니다.