본문 바로가기
알고리즘/프로그래머스

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

by MINTOEngineer 2023. 11. 24.

최빈값 구하기

문제 설명

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

입출력 예 설명

입출력 예 #1

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 예 #2

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 예 #3

  • [1]에는 1만 있으므로 최빈값은 1입니다.

 

문제 해석 및 풀이

lv0에 간단한 문제다. 

매개변수로 주어진 array 값을 for문으로 돌면서 특정 값에 갯수를 저장했다가 최대 갯수에 해당하는 아이를 return 해주면 되는 간단한 문제다.

 

해시맵과 비슷한 구조로 각 숫자마다 갯수를 저장하는 데이터가 있다면 쉽게 문제를 해결할 수 있다. 이를 위해 두개의 배열을 만들어서 첫 번째 배열엔 기존에 없던 값일경우 그대로 key값을 의미하는 숫자를 넣고 해당 index를 기억하고 있다가 새로운 데이터면 두 번째 배열에 push 명령어로 새로운 개수 1을 넣어주고 기존에 있던 값이면 첫 번째 배열에서 해당 값에 index를 추출해서 두 번째 배열에 해당 인덱스로 접근해 값을 +1 해준다. 

 

이 작업을 for문을 돌면서 반복하고 나면 나오는 결과인 두개의 배열에서 두 번째 배열의 최대 갯수를 구해 해당 갯수가 두 번째 배열에 두개이상 있으면 -1을 return하고 아니라면 해당 값의 index를 추출해서 첫 번째 배열에서 해당 index 값을 가져와 return 해주면 된다.

 

풀이 코드

 

function solution(array) {
    var answer = 0;
    const a = [];
    const b = [];
    
    for (let i = 0; i < array.length; i++) {
        if (!a.includes(array[i])) {
            a.push(array[i]);
            b.push(1);
        } else {
            const index = a.indexOf(array[i]);
            b[index] += 1;
        }
    }
    const max = Math.max(...b);
    const count = b.reduce((c, a) => c + (max === a), 0);

    if (count === 1) {
        const index = b.indexOf(max);
        answer = a[index];
    } else {
        answer = -1;
    }
    
    return answer;
    
    
}