[Programmers][JS] Lv0. 최빈값 구하기

mj·2024년 6월 30일
0

코딩테스트문제

목록 보기
29/50
post-custom-banner

문제

문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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

function solution(array) {
    let counter = new Map();
    
    // counter
    for (let i of array) {
        if (counter.has(i)){
            counter.set(i, counter.get(i) + 1)
        }else {
            counter.set(i, 1)
        }
    }
    
    // sort
    let mapEntries = Array.from(counter.entries());
    mapEntries.sort((a, b) => b[1] - a[1])
    
    // return
    if(counter.size >= 2 && mapEntries[0][1] == mapEntries[1][1]){
        return -1
    }else{
        return mapEntries[0][0]
    }
    
    return mapEntries[0][0]
}
  1. 배열 요소의 개수를 세어 맵으로 저장.
    [1, 2, 3, 3, 3, 4]Map(4) { 1 => 1, 2 => 1, 3 => 3, 4 => 1 }
  2. Map의 value를 기준으로 정렬
  3. Map의 길이가 2이상인경우, 정렬된 값의 첫번째와 두번째 개수가 같으면 최빈값이 여러개라는 뜻이므로 -1 반환
  4. Map의 길이가 2이상이 아니면(길이가 1인경우) 개수 반환

다른 풀이 - Object

function solution(array) {
    let count = {};
    
    // 배열 요소의 빈도를 계산
    for (let element of array) {
        if (count[element]) {
            count[element]++;
        } else {
            count[element] = 1;
        }
    }
    
    // 가장 빈도가 높은 요소 찾기
    let maxCount = 0;
    let mostFrequent = null;
    let multipleMax = false;
    
    for (let key in count) {
        if (count[key] > maxCount) {
            maxCount = count[key];
            mostFrequent = key;
            multipleMax = false;
        } else if (count[key] === maxCount) {
            multipleMax = true;
        }
    }
    
    // 최빈값이 여러 개인 경우 -1 반환
    return multipleMax ? -1 : +mostFrequent;
    
}
profile
일단 할 수 있는걸 하자.
post-custom-banner

0개의 댓글