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 |