🍀 코딩 테스트/쉽게 배우는 JavaScript 알고리즘 입문

최빈값 알고리즘

놀러와요 버그의 숲 2022. 8. 21. 00:36
728x90
반응형

 

## 최빈값 알고리즘 :

데이터 중에서 가장 많이 나타난 값.

최빈값 알고리즘의 핵심은 배열의 데이터 자체를 index로 보는 것이다.

예를 들어서

let scores = [1, 3, 4, 3, 5];

이 점수들을 index로 취급하는 것이다. 그래서 1이면 1번째 index 1증가, 3이면 3번째 index에 2가 증가하는 것이다. 
(3이 두번 나왔기 때문이다.)
그리고 그 값의 최댓값의 대한 index를 찾아내주면 그게 최빈값이다.

정리하자면 데이터를 index로 취급하고 개수 알고리즘을 사용. 그리고 최댓값을 구해주면 그것이 최빈값이 된다.

 

// 문제: 주어진 데이터에서 가장 많이 나타난(중복된) 값

// 최빈값 알고리즘(Mode Algorithm): 점수 인덱스(0 ~ n)의 개수(Count)의 최댓값(Max)

(function () {
  //[1] Input
  const scores = [1, 3, 4, 3, 5]; //0부터 5까지만 들어온다고 가정.
  let indexes = Array(scores.length + 1).fill(0); // 0~5까지 점수 인덱스의 개수 저장
  let max = Number.MIN_SAFE_INTEGER; // MAX 알고리즘 적용
  let mode = 0; // 최빈값이 담길 그릇.
  //[2] Process
  for (let i = 0; i < scores.length; i++) {
    indexes[scores[i]]++; // count 알고리즘 적용.
  }
  // indexes 배열에서 가장 최댓값을 구해준다.
  for (let i = 0; i < indexes.length; i++) {
    if (indexes[i] > max) {
      max = indexes[i];
      mode = i; // 그때의 index값이 최빈값이더라.
    }
  }

  //[3] Output
  console.log("최빈값 " + mode + "-> " + max + "번 나타남");
})();

조금 어려웠던 점이 두 가지가 있었다. 

 

1) 어떻게 하면 scores 배열의 각 값들을 indexes의 index로 바꿔주는가?

2) indexes의 각 값들을 어떻게 증가시켜줄까?

 

이에 대한 대답은 아래의 코드에 있었다.

 for (let i = 0; i < scores.length; i++) {
    indexes[scores[i]]++; // count 알고리즘 적용.
  }

그냥 말 그대로 indexes[] 에다가 scores[i]를 넣어주고 ++ 연산자로 값을 증가시켜주는 방식이었다.

살짝 충격이었다.

 

또 다르게 배운점은 만약 배열의 index를 찾고자 할 때 for문의 i를 의심해보자는 습관을 기르자는 것이다.

굳이 indexOf() 같은 메서드로 찾을 필요가 없다. 

 

for (let i = 0; i < indexes.length; i++) {
    if (indexes[i] > max) {
      max = indexes[i];
      mode = i; // 그때의 index값이 최빈값이더라.
    }
  }

 

위의 코드 처럼 어처피 i가 0부터 순회하기에 그 때의 index를 찾을 때 그냥 i로 해결해주는 것도 나쁘지 않다. 

'🍀 코딩 테스트 > 쉽게 배우는 JavaScript 알고리즘 입문' 카테고리의 다른 글

그룹 알고리즘  (0) 2022.08.21
선택 정렬 알고리즘  (0) 2022.08.12
순위알고리즘  (0) 2022.07.25
근사값 알고리즘  (0) 2022.07.19
최솟값 알고리즘  (0) 2022.07.19