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

자바스크립트 배열에서 중복 횟수가 가장 적은 요소 찾기

이번 글에서는 중복된 값이 포함될 수 있는 리터럴 배열을 입력받아, 가장 적은 횟수로 반복 등장한 모든 요소를 배열 형태로 반환하는 자바스크립트 함수를 작성해 보겠습니다.

예를 들어, 입력 배열이 다음과 같다고 가정해 봅시다.

const arr = [1,1,2,2,3,3,3];

이때 기대하는 출력 결과는 다음과 같습니다.

const output = [1, 2];

그 이유는 1과 2가 각각 2번씩만 등장하여 가장 적은 중복 횟수를 가지기 때문입니다. 반면 3은 3번 등장하므로 결과에서 제외됩니다.

구현 예제

const arr = [1,1,2,2,3,3,3];

const getLeastDuplicateItems = (arr = []) => {
   // 각 요소의 등장 횟수를 저장할 해시 객체 생성
   const hash = Object.create(null);
   let keys, min;

   // 배열을 순회하며 요소별 등장 횟수 카운트
   arr.forEach(el => {
      hash[el] = hash[el] || {
         value: el,
         count: 0
      };
      hash[el].count++;
   });

   // 등장 횟수를 기준으로 오름차순 정렬
   keys = Object.keys(hash);
   keys.sort((a, b) => {
      return hash[a].count - hash[b].count;
   });

   // 가장 적은 등장 횟수 확인
   min = hash[keys[0]].count;

   // 최소 횟수와 일치하는 요소만 필터링하여 반환
   return keys
      .filter(el => hash[el].count === min)
      .map(el => hash[el].value);
};

console.log(getLeastDuplicateItems(arr));

출력 결과

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

[ 1, 2 ]

코드 동작 원리

이 알고리즘의 핵심 로직은 다음 세 단계로 정리할 수 있습니다.

1단계 — 빈도 집계: Object.create(null)로 프로토타입 체인이 없는 순수한 해시 객체를 만들고, 배열을 한 번 순회하며 각 요소의 등장 횟수를 기록합니다.

2단계 — 정렬: 해시 객체의 키들을 등장 횟수 기준으로 오름차순 정렬합니다. 정렬 후 첫 번째 키의 count 값이 곧 최소 등장 횟수가 됩니다.

3단계 — 필터링 및 반환: 최소 등장 횟수와 동일한 count를 가진 요소들만 filter()로 걸러낸 뒤, map()으로 실제 값을 추출하여 배열로 반환합니다.

이 방식은 시간 복잡도가 O(n log n)으로, 배열을 여러 번 순회하지 않고도 효율적으로 최소 중복 요소를 찾을 수 있습니다. 또한 동일한 최소 횟수를 가진 요소가 여러 개일 경우 모두 함께 반환한다는 점이 특징입니다.