문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
- 0 < array의 길이 < 100
- 0 ≤ array의 원소 < 1000
풀이
음.. 다른 풀이 방식도 있겠지만 다른 포스트에서도 그렇듯 내가 선호하는 방식은
각각의 숫자가 몇개있는지가 담긴 객체를 reduce를 사용해서 만드는 방식이다.
const solution = (array) => {
const numberCountObj = array.reduce((acc, cur) => {
acc[cur] ? acc[cur] += 1 : acc[cur] = 1;
return acc;
}, {});
const sortObj = Object.entries(numberCountObj).sort(([key1, value1], [key2, value2]) => {
return value2 - value1;
})
const duplicationCount = sortObj.filter(([key, value]) => {
return +sortObj[0][1] === +value;
}).length
return duplicationCount > 1 ? -1 : +sortObj[0][0];
}
이번에도 조금 불필요하게 코드가 길어지긴했는데,
우선 numberCountObj로 주어진 array의 원소들의 갯수를 key : value 형태로 객체화 시켰다.
이후 최빈값을 구해야 하므로 만들어진 객체를 Object.entries를 이용해 [key, value] 형태의 이차원 배열로 변경 한 뒤,
sort() 매서드를 이용해 value를 내림차순으로 정렬해주었다.
이후 최빈값이 여러개인 경우를 체크하기 위해서 sortObj에 filter 매서드로, sortObj의 첫번째 (최빈값)와 값이 같은 경우만 리턴 해주도록 한뒤, 해당 배열의 갯수를 체크하였다.
마지막으로 중복값이 1이상인경우 (중복이 있을 경우) 문제에서 제시한대로 -1을 리턴해주고, 그 외의 경우 sortObj의 첫번째 키를 리턴해주었다. 이때, sortObj의 첫번째 키가 문자열이였기때문에 앞에 +를 붙여서 숫자형으로 변경해주었다.