본문 바로가기
개발(Development)/JS(자바스크립트)

[Javascript]문자열(단어)/숫자 최빈값(mode)구하는 방법(+빈도순 정렬) in 배열

by 카레유 2021. 2. 2.

문자열(string, 단어)이나 숫자가 포함된 배열에서 아래의 두가지를 구하는 방법을 정리한다.

 

1. 최빈값(mode: 최다 출현 요소) 구하기

2. 출현 횟수 순 정렬하기(+ 각요소의 개수 파악)

 

예를 들면, [ 'apple',  'banana', 'banana', 'carrrot', 'carrrot', 'carrrot'] 와 같은 배열에서

 

개수가 가장 많은 'carrot'를 뽑아내거나,(최빈값)

출현빈도 순으로 [ ['carrrot', 3], ['banana', 2], ['apple', 1] ] 와 같이 정렬하고, 개수를 같이 표시해주는 식이다.


1. 최빈값(mode) 구하기

함수의 파라미터로 배열을 넣어 호출하면, 개수가 가장 많은 요소를 반환한다.

 

<구현 코드>

function getMode(array){
    // 1. 출연 빈도 구하기
    const counts = array.reduce((pv, cv)=>{
        pv[cv] = (pv[cv] || 0) + 1;
        return pv;
    }, {});

    // 2. 최빈값 구하기
    const keys = Object.keys(counts);
    let mode = keys[0];
    keys.forEach((val, idx)=>{
        if(counts[val] > counts[mode]){
            mode = val;
        }
    });

    return mode;
}

 

<사용 예시>

// 1. 문자열(단어)
const strings = ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd'];
getMode(strings); // d


// 2. 숫자
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
getMode(numbers); // 4


// 3. 문자열(단어) + 숫자
const mix = [2, 2, 3, 3, 3, 'a', 'b', 'b'];
getMode(mix); // 3

 

<작동 원리>

1. 배열의 각 요소들의 출현 빈도를 구하고,

2. 출현 빈도가 가장 높은 요소를 반환한다.

 

(참고) 배열의 각 요소별 출현 빈도 구하는 방법에 대한 글

[Javascript]배열 문자열/숫자 요소 중복제거, 출현횟수(개수) 구하는 방법

 

근데 이 함수는 최빈값이 여러개인 경우, 하나만 반환하기 때문에 아쉬운 부분이 있을 수 있다.

그래서 아래의 출현 횟수별 정렬 함수를 만들었다.

 

2. 출현 빈도순 정렬하기

: 함수의 매개변수로 배열을 넣어 호출하면, 개수가 가장 많은 순으로 요소들을 정렬하여 반환한다.(출현 횟수 포함)

 

<구현 코드>

function getSortedArr(array) {

    // 1. 출연 빈도 구하기
    const counts = array.reduce((pv, cv)=>{
        pv[cv] = (pv[cv] || 0) + 1;
        return pv;
    }, {});

    // 2. 요소와 개수를 표현하는 배열 생성 => [ [요소: 개수], [요소: 개수], ...] 
    const result = [];
    for (let key in counts) {
        result.push([key, counts[key]]);
    }

    // 3. 출현 빈도별 정리하기
    result.sort((first, second) => {
        // 정렬 순서 바꾸려면 return first[1] - second[1];
        return second[1] - first[1];
    });

    return result;
}

 

<사용 예시>

// 1. 문자열(단어)
const strings = ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd'];
getSortedArr(strings);
// [ [ 'd', 4 ], [ 'c', 3 ], [ 'b', 2 ], [ 'a', 1 ] ]


// 2. 숫자
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
console.log(getSortedArr(numbers));
// [ [ '4', 4 ], [ '3', 3 ], [ '2', 2 ], [ '1', 1 ] ]


// 3. 문자열(단어) + 숫자
const mix = [2, 2, 3, 3, 3, 'a', 'b', 'b'];
console.log(getSortedArr(mix));
// [ [ '3', 3 ], [ '2', 2 ], [ 'b', 2 ], [ 'a', 1 ] ]

3번째 예시처럼, 출현빈도가 같은 '2' 와 'b'를 모두 포함하여 정렬한다.

 

<작동 원리>

1. 요소별 개수를 파악하고,

2. [각요소, 개수] 를 요소로 하는 배열을 만들고,

3. Array.prototype.sort 메서드로 정렬한다.

 

참고로 sort메서드는 원본 배열을 정렬시키는데,

1) 콜백함수의 리턴값이 +이면 첫번째 인수를 우선 정렬하고,

2) 콜백함수의 리턴값이 -이면 두번째 인수를 우선 정렬한다.

3) 0이면 정렬 안하고그냥 둔다

 

그래서 오름차순, 내림차순의 정렬순서를 바꾸려면

return second[1] - first[1]; 부분을

return first[1] - second[1]; 로 수정해주면 된다.


필자가 개발중인 프로젝트에 필요해서 이것 저것 참조해서 급하게 만든 것이므로,

각자의 입맛에 맞게 수정/응용해서 사용하면 좋을듯 하다.

 

도움이 되셨길.

 

댓글