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

JavaScript 배열에서 최빈값 구하기 – 빈도가 같으면 가장 먼저 등장한 값 반환

문제 개요

리터럴 값(문자열, 숫자 등)으로 이루어진 배열을 인자로 받아 가장 많이 등장하는 값을 반환하는 자바스크립트 함수를 작성해 보겠습니다. 단, 여러 값의 등장 횟수가 서로 같을 경우에는 그중 배열에서 가장 먼저 등장한 값을 반환해야 합니다.

문제 예시

다음 배열을 살펴보겠습니다.

const arr = ['25', '50', 'a', 'a', 'b', 'c'];

여기서는 'a'가 두 번 등장해 빈도가 가장 높으므로 결과는 'a'가 되어야 합니다.


const arr = ['75', '100', 'a', 'b', 'b', 'a'];

이 경우 'a'와 'b'가 각각 두 번씩 등장하여 빈도가 동일합니다. 하지만 'a'가 'b'보다 먼저 나왔기 때문에 역시 'a'를 반환해야 합니다.

코드 구현

이 문제를 해결하는 코드는 다음과 같습니다.

const arr = ['25', '50', 'a', 'a', 'b', 'c'];
const arr1 = ['75', '100', 'a', 'b', 'b', 'a'];
const getMostFrequentValue = (arr = []) => {
    let count = 0, ind = -1;
    arr.forEach((el, i) => {
        this[el] = this[el] || { count: 0, ind: i };
        this[el].count++;
        if (this[el].count > count) {
            count = this[el].count;
            ind = this[el].ind;
            return;
        };
        if (this[el].count === count && this[el].ind < ind) {
            ind = this[el].ind;
        };
    }, Object.create(null));
    return arr[ind];
};
console.log(getMostFrequentValue(arr));
console.log(getMostFrequentValue(arr1));

동작 원리

핵심 로직은 다음과 같이 정리할 수 있습니다.

  • 빈도 추적: 각 고유 값마다 { count, ind } 객체를 만들어 등장 횟수(count)와 첫 등장 인덱스(ind)를 기록합니다.
  • 최빈값 갱신: 현재 값의 등장 횟수가 지금까지의 최대 빈도보다 크면, 최대 빈도와 해당 인덱스를 새로 갱신합니다.
  • 동률 처리: 등장 횟수가 최대 빈도와 같지만 첫 등장 인덱스가 더 앞서면, 인덱스를 더 앞선 값으로 교체합니다.
  • 결과 반환: 마지막에 저장된 인덱스(ind)로 원본 배열의 값을 조회하여 반환합니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

a
a

두 예제 모두 조건에 맞게 'a'가 정상적으로 출력되는 것을 확인할 수 있습니다. 이처럼 빈도 카운트와 첫 등장 인덱스를 함께 관리하면, 동률 상황에서도 원하는 우선순위 규칙을 손쉽게 적용할 수 있습니다.