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

JavaScript로 서로 다른 인덱스에 있는 동일한 요소 쌍 개수 세기

문제 이해하기

정수로 이루어진 배열을 첫 번째이자 유일한 인수로 받아 처리하는 JavaScript 함수를 작성해야 합니다. 이 함수의 목표는 값은 서로 같지만 위치(인덱스)가 다른 요소 쌍의 총 개수를 계산하는 것입니다.

예를 들어, 입력 배열이 다음과 같다고 가정해 보겠습니다.

const arr = [7, 9, 5, 7, 7, 5];

이 경우 기대되는 출력값은 다음과 같습니다.

const output = 4;

그 이유는 조건에 부합하는 쌍이 [7, 7], [7, 7], [7, 7], [5, 5]로 총 4개이기 때문입니다. 숫자 7은 세 번 등장하므로 3개 중 2개를 뽑는 조합인 3C2 = 3개의 쌍이 만들어지고, 숫자 5는 두 번 등장하여 1개의 쌍을 형성합니다.

접근 방법: 해시 맵 활용

가장 효율적인 방법은 각 숫자가 지금까지 몇 번 등장했는지 추적하는 객체(해시 맵)를 사용하는 것입니다. 배열을 한 번만 순회하면서, 현재 요소와 같은 값을 가진 이전 요소의 개수를 정답에 더해 주면 됩니다. 이렇게 하면 이중 반복문 없이 시간 복잡도 O(n)으로 문제를 해결할 수 있습니다.

코드 구현

다음은 위 로직을 구현한 전체 코드입니다.

const arr = [7, 9, 5, 7, 7, 5];
const equalPairCount = (arr = []) => {
   if(!arr?.length){
      return 0;
   };
   const map = {}
   let count = 0;
   arr.forEach((val) => {
      if (map[val]) {
         count += map[val];
      };
      map[val] = map[val] + 1 || 1;
   });
   return count;
};
console.log(equalPairCount(arr));

동작 원리 살펴보기

코드의 핵심 흐름은 다음과 같습니다.

1. 빈 배열이 입력되면 즉시 0을 반환합니다.
2. 각 요소를 순회하면서 해당 값이 이미 맵에 존재한다면, 그 값의 등장 횟수만큼 count에 더합니다. 이는 새로운 요소가 이전에 등장한 동일한 값들과 각각 하나의 쌍을 이루기 때문입니다.
3. 마지막으로 해당 값의 등장 횟수를 1 증가시켜 맵을 갱신합니다.

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

4