본문 바로가기

Algorithm/문제

[프로그래머스] 0v, 최빈값 구하기

728x90

1. 문제

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해 보세요. 최빈값이 여러 개면 -1을 return 합니다.

 

1) 내 코드 

function solution(array) {
    let obj = {};
    
    //겹치는 숫자 count
    array.forEach(num => {
        if(obj[num] === undefined) obj[num] = 1
        else obj[num] = obj[num]+1
    })
    
    let max = Math.max.apply(null, Object.values(obj));
    let maxAll = Object.keys(obj).filter(key => obj[key] === max)
    
    if(maxAll.length > 1) return -1
    else return Number(maxAll[0])
}

solution([1, 2, 3, 3, 3, 4])

 

최빈값이 어떤 것인지 구하는 문제이다.

 

array.forEach(num => {
    if(obj[num] === undefined) obj[num] = 1
    else obj[num] = obj[num]+1
})

 

우선, 각 요소가 몇번씩 출력되는지 찾기 위해서 forEach를 통해서 겹치는 숫자를 카운트해 줬다.

key로 요소를 넣어주고, value로 요소의 개수를 넣어줬다. 

 

let max = Math.max.apply(null, Object.values(obj));

 

그 후 Math.max.apply를 사용해 object의 value 중 가장 큰 값을 찾아준다.

 

 

let maxAll = Object.keys(obj).filter(key => obj[key] === max);

 

object 중에서 max 값을 가지고 있는 것들을 배열로 출력해 준다.

 

 

if(maxAll.length > 1) return -1
else return Number(maxAll[0])

 

마지막으로 maxAll이 1개 이상이면, 최빈값이 여러 개라는 의미이므로 -1을 리턴하고,

그렇지 않다면 MaxAll [0] 번째 값을 리턴해준다.

 

이때 value는 string 타입으로 저장되어 있으므로 Number를 통해 숫자로 바꿔준다. 

 

 

*Object.values

 

객체의 value를 배열로 리턴하는 메서드.

 

 

*apply

 

this에 새로운 객체를 바인딩할 때 사용하는 메서드.

apply()를 이용해 작성된 메서드를 다른 객체에 상속할 수 있다. 

 

 

2) 다른 사람 코드 

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을 사용한 사람들이 있더라.. 이렇게 풀 수도 있다는 걸 느꼈다.

매번 익숙한 방식으로 푸니까 다른 방법은 잘 생각하지 못하게 되는 것 같다.

다양한 풀이법을 보고 익숙해지도록 노력해야겠다 

728x90