Dev/Algorithm

[코딩테스트] 최빈값 구하기

隣席の開発者群 2023. 4. 14. 12:24
반응형

이 문제 상당히 난감했다. 해답을 보고도 아하! 라며 바로 이해하기 보단 한줄한줄 따라가며 읽어야지만 눈에 들어와서 

따로 디테일한 공부 없이 뇌빼고 코딩했던 나같은 사람들한테는 진입장벽이 조금 높을 수도 있겠다는 생각이 들었다. 

 

문제 : 최빈값 구하기

 

문제 설명

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


제한사항
  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

입출력 예

arrayresult
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

 

이런 식으로 배열 내에 중복된 요소가 가장 많은 값을 찾는 것이었는데,

그럼 각 요소마다 카운트를 어떻게 하는가 라는 고민을 하게 만들었다. 
배열 안에 어떤 요소가 들어올지도 모르니 말이다.

 

결국 답을 찾아봤는데, Map을 사용해 key:value로 가지고 있는 방법을 다들 쓰고 있었다. 

function solution(array) {
    let m = new Map();
    array.map(item => {
        m.set(item, (m.get(item) || 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;
}

1. Map 객체를 만들어 array 안의 요소를 key로 사용, 해당 키를 사용해 루프를 돌 때마다 해당 키를 가진 요소가 있으면 value에 +1을 해서 set을 해준다. 

2. 그렇게 만들어진 Map 객체를 value의 크기에 따라 내림차순 정렬

3. 요소가 하나 뿐이거나, 두번째 key값에 대한 value보다 첫번째 key값에 대한 value가 크다면 첫번째 key값을 리턴, 그 외에는 최빈수가 중복인 것이니 -1을 리턴 

 

이러한 로직이었다. 솔직히 이해는 됐는데 과연 실전에서 써먹을 생각을 할 수 있을까라는 의문이 든다..

LIST