[lv.0] Javascript 최빈값 구하기

 

예를 들어, array  = [1,2,3,3,3,4]의 최빈값은 가장 많은 빈도의 3이어야 하고,

array = [1,1,2,2]의 최빈값은 1, 2의 빈도수가 같으므로 출력값은 -1로 나와야 합니다.

 


 

1. 각 원소의 개수를 센다. ex) a의 개수 = 3, 최빈값 = a

2. 연속한 배열값이 같다면 수를 증가하고, 다르면 개수를 비교한다.

3. 앞서 셌던 숫자의 개수보다 지금의 개수가 많다면,  최빈값이 바뀐다. ex) b의 개수 = 4, 최빈값 = b

4. 개수가 같다면 최빈값은 -1이다.

 

function solution(array) {
    const length = array.length; //array 길이
    let mode; // 최빈값
    let Subcount = 0; // 최빈값의 수
    let count = 0; // 현재값의 수
    
    if(length === 1){ // 배열 길이가 1이라면, 최빈값은 어짜피 하나로 정해져 있다.
        mode = arr[0];
    }else{
        for(i=0; i<length; i++){
            if(arr[i] === arr[i+1]){ //값이 같다면 현재값+1
                count = count + 1;
            }else{
                count = count + 1; //다르면 현재값 +1 하고 개수 비교
                if(Subcount < count){
                    Subcount = count;
                    mode = arr[i];
                }else if(Subcount === count){
                    mode = -1;
                }
                count = 0; //count를 0으로 초기화
            }
        }
    }
    var answer = mode;
    return answer;
}

그런데 이렇게 했더니 오류가 떠서 고민을 많이 했는데, 문제는 아주 사소한 것이었어요.

배열값이 오름차순으로 정렬되어있는 것을 기준으로 작성한 것인데 그 조건을 뺴놓고 작성을 해버렸던 것이었어요.

 

function solution(array) {
    const length = array.length;
    const arr = array.sort();
    let mode;
    let Subcount = 0;
    let count = 0;
    
    for(i=0; i<length; i++){
    	if(arr[i] === arr[i+1]){
        	count = count + 1;
        }else{
            count = count + 1;
            if(Subcount < count){
            	Subcount = count;
            	mode = arr[i];
            }else if(Subcount === count){
                mode = -1;
            }
            count = 0;
        }
     }
    var answer = mode;
    return answer;
}

배열을 오름차순으로 정렬해주는 sort함수를 바로 추가해주었습니다.

그리고 생각해보니 배열 길이가 1인 경우를 굳이 추가하지 않아도 상관 없어서 빼버렸어요.

 


아주 간단하게 적어놨지만 저 문제 푸는데 꼬박 하루 걸린 것 같네요.

풀고나면 정말 별거 없는데 왜 이리 어려운지... 참 알다가도 모르겠습니다.

 

 

풀면서 작성한 A4