[기초 Lv.0] 최빈값 구하기

oaksusu·2024년 3월 19일
0
post-thumbnail

오답노트 21번

1. 문제 (링크) :

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

2. 내가 푼 방법 :

  1. Set 객체를 활용해서 어떤 숫자들이 있는지 중복된 값은 제거하여 list 변수에 할당
  2. countList 변수에는 list 변수에 할당된 객체를 순환하는데, array의 값과 list값이 일치할때만을 filter한 후 array의 길이를 구해 list 값이 array안에서 몇 번 반복됐는지를 반환
  3. sortList에는 반복 횟수들이 들어가 있어서 해당 값들을 내림차순으로 정렬
  4. sortList[0]에는 가장 큰 반복횟수가 들어있을것이고, countList에서는 max가 들어있는 인덱스 번호를 알아내어 list[인덱스]를 알아내면 최빈값을 구할 수 있음
function solution(array) {
    const list = new Set(array);
    const countList = [...list].map((listEle, idx) => {
        return array.filter(arrEle => arrEle === listEle).length
    });
    const sortList = [...countList].sort((a,b) => b - a);
    let max = sortList[0], idx = countList.indexOf(max);

    return sortList[0] === sortList[1] ? -1 : [...list][idx];
}

=> 내가 푼 방법은 문제의 요구사항을 코딩으로 풀어둔 느낌이고
계속 새로운 배열을 만들어줘야 하기 때문에 효율적으로 푼 느낌이 없는 것 같다..

3. 괜찮아 보였던 풀이 방법 (참고할 만한 풀이):

참고한 풀이를 정리하는 이유는,
reduce로 주어진 값과 주어진 값이 반복된 횟수를 하나의 객체로 관리할 수 있게 활용했기 때문이다.

3-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];
}

3-2. 참고한 풀이를 이해하고 내가 다시 푼 풀이

function solution(array) {
    const counts = array.reduce((acc, cur) => ({
        ...acc,
        [cur]: (acc[cur] || 0) + 1
    }), {})
    
    const sorting = Object.keys(counts).sort((a,b) => counts[b] - counts[a]);
    return counts[sorting[0]] === counts[sorting[1]] ? -1 : Number(sorting[0])
}
profile
삐약

0개의 댓글