[JavaScript] 프로그래머스 - 최빈값 구하기

공태윤·2024년 1월 30일

코딩테스트

목록 보기
1/9
post-thumbnail

문제

정수 배열 array가 매개변수로 주어질 때, 최빈값을 return한다. 하지만, 최빈값이 여러개라면 -1을 return하는 solution 함수를 만들어라.

내가 푼 코드

function solution(array) {
    const set = new Set(array);
    const arr = Array.from(set);
    const result = arr.map((i) => {
        return array.filter((element) => i === element).length;
    });

    const max = Math.max(...result);

    const num = result.filter((element) => max === element).length;
    if (num > 1) {
        return -1;
    }
    else {
        const index = result.findIndex((e) => e === max);
        return arr[index];
    }
}

코드 설명

매개변수 array를 Set 자료형을 통해 중복되는 값이 나오지 않도록 만들었다.
그리고 배열의 map 메소드를 이용하여 매개변수 array에 특정 값이 몇개가 있는지를 result라는 배열에 저장하였다.

특정 값을 찾을 때는 filter 메소드를 이용하여 특정 값만 있는 배열을 만들고, 그 배열의 길이를 이용하여 얻을 수 있었다.

그리고 그 배열의 최대값을 찾아 max 변수에 저장하였다.

그 max 값이 몇개있는지 위와 같은 filter 메소드를 이용하여 값이 1개 이상이라면 -1을 리턴하도록, 그렇지 않다면 그 max를 가진 Index를 이용하여 최빈값을 찾아주었다.

다른 풀이

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

코드 설명

Set 자료형을 이용하는 것이 아닌 Map 자료형을 이용하였다.

Map은 Key와 Value가 있는 자료구조로 [1, 2, 3, 3] 이런 배열을 파라미터로 받았을 때
[Map]
1 : 1
2 : 1
3 : 2

이렇게 배열의 값을 저장할 수 있다.

array 매개변수를 기반으로 Map.set() 메소드를 이용하여 값을 저장한다. 값의 빈도를 구하는 것이기 때문에 value에는 count 값이 들어가야 한다.

처음 저장하는 것이라면 Map.get() 메소드를 통해 value 값을 찾으면 undefined가 나올 것이다. 그러면 ?? nullish 병합 연산자를 통해 undefined는 0이 되고, 1을 더하여 1이 된다.

Map에 이미 저장되어 있는 값이라면 value + 1이 저장될 것이다.

그렇게 배열에서 key들이 value만큼 저장되어 있는지 알 수 있다.

배열에서 값들을 저장한 이후 Map 자료형을 내림차순으로 정렬해준다.

그리고 return을 해주는데 천천히 표현식을 분석해보자면

  1. m.length === 1
  2. m[0][1] > m[1][1]

우선, 배열의 길이가 1이라면 특정 값만 있다는 것이다.
그리고 두 번째 조건을 보면 0번째 값이 1번째 값보다 크므로 최빈값이 유일하다는 것이다.

따라서, m[0][0] 최빈값을 return하고, 그렇지 않다면 -1을 return하게 된다.

회고

Map, Set 자료구조의 쓰임에 대해 배운 의미있는 문제인거 같다.

m.get(n) || 0 코드는 m.get(n) ?? 0으로 직접 수정한 코드였다.

나는 OR 연산자보다는 nullish 병합 연산자를 주로 이용하는데 취향차이인지 성능 등 이점이 있는지 궁금하다.

혹시, 이에 대해 잘 알고 있으신 분은 댓글 부탁드립니다 🥺🥺

profile
기록으로 성장하는 프론트엔드 개발자입니다!

0개의 댓글