[코딩테스트] JavaScript/[코테] 프로그래머스

[프로그래머스 / JS ] Lv.0 / 120812 : 최빈값 구하기

jini-dev 2025. 1. 12. 12:49
SMALL

최빈값 구하기(링크)

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

 

문제 풀이

function solution(array) {
    const answer = [];
    for(let i = 0; i < array.length; i++) {
        answer[array[i]] = (answer[array[i]] || 0) + 1;
    }

    const maxNum = Math.max(...answer.filter(x => x !== undefined));
    const maxCount = answer.filter((num) => num === maxNum).length;
    return maxCount > 1 ? -1 : answer.indexOf(maxNum);
}

 

최빈값 문제 너무 어려웠다.. 분명 초보로 나와있었는데 ㅠㅠㅠ

미루고 미루다 오늘 풀어보았다!


먼저 answer 배열을 선언한다.

for문으로 반복하며 array 값을 answer 배열의 인덱스로 사용했다.

(그니까 array[0] 값인 1이 나오면 answer[1] 에 카운팅 한것임)

=> 그러면 최종적으로 array의 최빈 값은 answer 배열의 최대 값이 될 것 이다

 

입출력 예 1로

만약 i가 0일 때 answer[0] 값에 answer[0] 값이 있으면 answer[0] +1 을, 없으면 0+1 을 적용하도록 했다.

최종적으로 answer에 저장되는 배열은 [undefined, 1,1,3,1] 이 된다.

array 배열의 인덱스 0에 저장된 값부터 확인하기 위해 i를 0부터 적용했기 때문이다.

 

answer 배열의 최댓 값을 구할 maxNum 변수를 선언하고

바로 Math.max를 사용하면 오류가 나기 때문에, filter 메소드를 활용해 answer에서 null값은 제외한 값에서 최댓값을 구하도록 했다.

=> maxNum은 3

 

answer 배열의 최댓 값이 여러개인지확인하기 위해 maxCount 변수를 선언하고

filter 함수를 사용하여 answer 배열의 maxNum(최빈 값)과 값이 동일한  수의 배열만 반환하고 그 배열의 길이를 구했다.

=> maxCount 은 1

 

maxCount 의 값이 1보다 크다면 최빈 값을 가진 수가 2개 이상이기 때문에 바로 -1을 반환하고

아니라면 최빈 값을 반환해야한다.

여기서 maxNum을 그대로 반환하지 않는 이유는 '얼마나 많이 나왔는지(빈도수)'를 구하는 것이 아니라 '많이 등장한 수가 무엇인지(최빈 값)'를 구하는 것이기 때문에 indexOf 메소드로 maxNum의 인덱스를 반환했다.

(answer 배열의 인덱스 값이 array 인덱스 내 실제  값이기 때문에)


위 글이 복잡한 것 같아서 다시 정리해보자면

array = [1, 2, 3, 3, 3, 4];

answer = [] 가 있으면

 

array[0] = 1 은 answer[1] 에 카운팅 +1

array[1] = 2 은 answer[2]에 카운팅 +1

array[2] = 3 은 answer[3]에 카운팅 +1

array[3] = 3 은 answer[3]에 카운팅 +1

array[4] = 3 은 answer[3]에 카운팅 +1

array[5] = 4 은 answer[4]에 카운팅 +1

 

그래서 answer = [undefinded, 1, 1, 3, 1] 이렇게 되는 것이고

answer[3] = 3 으로 array 배열에서 3의 숫자가 3번 등장한 것을 알 수 있다.

 

answer 배열의 인덱스 = 최빈 값 (최대로 많이 등장한 값) 

answer 배열의 값 = 빈도수 (값이 등장한 정도) => 이때 최대 빈도수인 3이 maxNum으로 적용

 

최대 빈도수가 1개 이상인지 확인하는 maxCount 

maxCount 는 [3].length 이고 값이 1이기 때문에 최빈 값인 answer 배열의 인덱스를 반환

(입출력 예 2의 maxCount는 [2,2].length === 2 로 -1 반환)

LIST