programmers

[Programmers Level 0 obj] 최빈값 구하기 Javascript

냠냠맨 2022. 12. 9. 13:54

문제정보

 

 

가장 많이 등장한 수를 리턴시켜주는 문제입니다.

키-값쌍을 이용해서 문제를 풀 수 있을거라고 생각하고 저는 객체를 만들어서 문제를 해결했습니다.

 

 


 

나의풀이

 

function solution(array) {
    let obj = {}
    for(i=0; i<array.length ; i++) {
        if(obj[array[i]] == undefined) {
            obj[array[i]] = 1
        }
        else {
            obj[array[i]]++
             } 
    }
    let sortObj = Object.entries(obj).sort( (a,b) => b[1] - a[1])
    if (sortObj.length < 2) return +sortObj[0][0] 
    return (sortObj[0][1] == sortObj[1][1]) ? -1 : +sortObj[0][0];
}

 

빈 객체를 선언

for문을 순회하면서 obj에 array[i]값이 존재하는지 확인

(만약 일치하는 키값이 없다면 그 키의 밸류는 undefined입니다.)

undefined인 경우 array[i]에 1을 밸류로 주고

undefined가 아니라면 중복값이니 밸류를 1올려줬습니다.

 

만약 이 과정을 생략하고 1을 더하려고하면 undefined에 1을 더하려하는 과정에서 오류가 발생해요

[1, 2, 3, 3, 3, 4]
이와 같은 배열이 주어졌을때 for문을 모두 순회한 뒤엔
[["1",1],["2",1],["3",3],["4",1]]

 

이러한 결과가 나옵니다.

 

entries()는 객체를 키값쌍의 2차원배열로 반환해줍니다.

만약 배열에 등장한 값의 종류가 하나인 경우에는 바로 리턴해주고

2개 이상인 경우에는 비교한 다음 최빈값이 여러개인경우 -1을 리턴할 수 있도록

삼항연산자를 통해 코드를 짰습니다.

 

 


 

다른사람의 풀이

 

function solution(array) {
    let m = new Map();
    for (let n of array) m.set(n, (m.get(n) || 0)+1);
    m = [...m].sort((a,b)=>b[1]-a[1]);
    return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
}

 

Map을 이용한 풀이네요

제 풀이보다 더 깔끔한 것 같습니다.

 

반응형