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

728x90
반응형
function solution(array) {

    let cnt ={};  //최빈값 담을 객체
    let max =0;   //최빈값 (value)
    
    array.forEach((x) => {
                 cnt[x] = (cnt[x] || 0)+1; 
                 });
    
    max = Math.max(...Object.values(cnt));
    let max_keys = Object.keys(cnt);
    let ans_keys = max_keys.find( (key)=> cnt[key]=== max); 
    let several = Object.keys(cnt).filter( (key)=> cnt[key] === max);
    
    if(several.length > 1){
        return -1;
    }
   else{
       return parseInt(ans_keys);
   }
    
}

 

[문제]

input  : array =[1,2,3,3,3,4]  / [1,1,2,2] / [1]

[답]

output : 3 / -1 / 1

 

** 실수 포인트: 최빈값의 개수가 아닌 값이 나와야함

 

풀이

1. 배열 반복 :: array.forEach(x) => console.log(x); // 1,2,3,3,3,4

2. 객체에 [ ] (대괄호 사용) 동적으로 넣어주기 :: cnt[x] = (cnt[x] || 0) +1 ;

(1) cnt[x] (x=1) --> 처음에 값이 없으니 undefined임

(2) undefined || 0 = 0 나옴

(3) 그 값에 0+1 을 해줘서 객체 ={ "1" : 1} 생성해줌

:

(4) cnt[x] (x=2,3) --> 위와 같은 개념으로 {"1":1,"2":1,"3":1}

(5) cnt[x] (x=두번째 3)  --> cnt[3] = 1 --> 1+1 --> {"1":1,"2":1,"3":2}

 

3. max = Math.max(...Object.values(cnt)); 

(1) 스프레드 연산자로 cnt객체의 값 중에서 최대값 추출 ( 최대값 value )

 

4. let max_keys = Object.keys(cnt);

(1) cnt객체의 keys 데이터

 

5. let ans_keys = max_keys.find( (key)=> cnt[key]=== max);

(1) find로 특정 key 데이터 찾기

(2) cnt객체[key] === 최대값 value 

 

6. 최빈값이 2개이면 (array =[1,1,2,2] ) ==> -1 return

let several = Object.keys(cnt).filter( (key)=> cnt[key] === max);

(1) max값 (최대값 value 가 2개 이상이면 = several.length)

(2) if(several.length > 1){ return -1; }

 

7. 최빈값이 1개면  return parseInt(ans_keys);

 

 

 

 

 

 

[출처]

1. 프로그래머스

 

반응형