본문 바로가기
기초다지기/JS 코딩테스트

javaScript 최빈값 구하기

by 김빵그 2023. 12. 7.

문제 

주어진 정수배열에서 가장 자주 나오는 값을 리턴. 최빈값이 여러개면 -1 리턴

풀이 

function solution(array) {
    // 각 숫자의 등장 횟수를 저장하는 객체 생성
    const frequencyMap = {};
    
    // 배열을 순회하면서 각 숫자의 등장 횟수를 계산
    for (let num of array) {
        if (frequencyMap[num] === undefined) {
            frequencyMap[num] = 1;
        } else {
            frequencyMap[num]++;
        }
    }
  
    // 최빈값 및 등장 횟수 초기화
    let mode = -1;
    let maxFrequency = 0;

    // 객체를 순회하면서 최빈값 찾기
    for (let key in frequencyMap) {
        if (frequencyMap[key] > maxFrequency) {
            mode = parseInt(key);
            maxFrequency = frequencyMap[key];
        } else if (frequencyMap[key] === maxFrequency) {
            // 최빈값이 여러 개이면 -1 반환
            mode = -1;
        }
    }

    return mode;
}

다른 풀이들

function solution(array) {
    let m = new Map();
    for (let n of array) m.set(n, (m.get(n) || 0)+1);
    m = [...m].sort((a,b)=>b[1]-a[1]);
    return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
}
  • Map 객체 
    • 숫자의 등장 횟수를 저장한다 
    • m.get(n) || 0을 통해 해당 숫자가 이전에 등장한 횟수를 가져오며, 만약 없으면 0으로 초기화
  • m
    • 배열 정렬, 등장 횟수에 따라 내림차순 정렬
    • b[1] - a[1] 두번째 열을 기준으로 내림차순
  • 정렬된 배열에서 첫번쨰 원소의 등장 횟수와 두번째 등장 횟수 비교해 최빈값 결정
const solution = (array) => {
    const counter = array.reduce((acc, cur) => ({
        ...acc,
        [cur]: (acc[cur] || 0) + 1
    }), {})

    const items = Object.keys(counter).map((key) => [
        Number(key), counter[key]
    ]).sort((a, b) => b[1] - a[1])

    if (items[0][1] === items?.[1]?.[1]) {
        return -1
    }

    return items[0][0];
}
  • reduce 
    • 배열 순회하며 각 숫자 등장 횟수 저장하는 counter 생성
    • ...acc 객체 전개 연산자 사용해 이전 상태 속성을 유지하며 새로운 등장 횟수 업데이트
  • object.keys map 
    • counter 객체의 키들을 배열로 가져온다 
    • map 함수를 사용해 각 키와 해당 키의 등장 횟수 배열로 매핑 
  • 최빈값 결정