«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Posts
Today
Total
관리 메뉴

on&on

[Javascript] Map을 활용한 최빈값 구하기 본문

Javascript

[Javascript] Map을 활용한 최빈값 구하기

다느 2022. 11. 29. 18:50

https://school.programmers.co.kr/learn/courses/30/lessons/120812

 

문제 설명

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

 

제한 사항

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

입출력 예

array result
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

 

풀이

Map을 활용해 각 값의 개수를 구하고 정렬하여 첫 번째 인덱스 값과 두 번째 인덱스 값을 비교하여 결과 출력

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

 

코드 설명

solution([1, 2, 3, 3, 3, 4])을 실행했을 때를 기준으로 설명한다.

 

1. Map 객체를 통해 키(숫자)-값(빈도)를 저장한다.

let m = new Map();

2. for of문을 통해 m에 값을 세팅한다.

for (let n of array) {
  m.set(n, (m.get(n) || 0)+1)
  console.log(m)
};

// Map(1) {1 => 1}
// Map(2) {1 => 1, 2 => 1}
// Map(3) {1 => 1, 2 => 1, 3 => 1}
// Map(3) {1 => 1, 2 => 1, 3 => 2}
// Map(3) {1 => 1, 2 => 1, 3 => 3}
// Map(4) {1 => 1, 2 => 1, 3 => 3, 4 => 1}
  • m에 n이 있다면 +1, n이 없다면 0+1로 설정한다. 
  • console을 찍어보면 값이 잘 세팅된 것을 볼 수 있다.

3. 가장 많이 발생한 순서대로 정렬한다.

console.log("1 :", m)
m = [...m].sort((a,b)=>b[1]-a[1]);
console.log("2 :", m)

// 1 : Map(4) {1 => 1, 2 => 1, 3 => 3, 4 => 1}
// 2 : 0:[3, 3], 1:[1, 1], 2:[2, 1], 3:[4, 1]

 

 

  • sort하기 위해 스프레드 문법을 사용한다. 
  • 각 배열의 1번 인덱스(즉, 발생 빈도) 값을 비교하여 오름차순으로 정렬한다.

4. 값을 비교하여 결과 반환

return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;

// m[0][1] => 3
// m[1][1] => 1
// m[0][0] => 3
  • 1. m의 값이 1개일 경우(주어진 배열이 1개일 경우), 첫 번째 값을 반환
  • 2. m의 첫 번째 요소의 1번째 인덱스 값이 두 번째 요소의 1번째 인덱스 값보다 클 경우, 첫 번째 값을 반환
  • 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];
}

reduce를 활용하는 법도 있다...~

Comments