on&on
[Javascript] Map을 활용한 최빈값 구하기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/120812
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한 사항
- 0 < array의 길이 < 100
- 0 ≤ array의 원소 < 1000
입출력 예
array | result |
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
풀이
Map을 활용해 각 값의 개수를 구하고 정렬하여 첫 번째 인덱스 값과 두 번째 인덱스 값을 비교하여 결과 출력
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;
}
코드 설명
solution([1, 2, 3, 3, 3, 4])을 실행했을 때를 기준으로 설명한다.
1. Map 객체를 통해 키(숫자)-값(빈도)를 저장한다.
let m = new Map();
2. for of문을 통해 m에 값을 세팅한다.
for (let n of array) {
m.set(n, (m.get(n) || 0)+1)
console.log(m)
};
// Map(1) {1 => 1}
// Map(2) {1 => 1, 2 => 1}
// Map(3) {1 => 1, 2 => 1, 3 => 1}
// Map(3) {1 => 1, 2 => 1, 3 => 2}
// Map(3) {1 => 1, 2 => 1, 3 => 3}
// Map(4) {1 => 1, 2 => 1, 3 => 3, 4 => 1}
- m에 n이 있다면 +1, n이 없다면 0+1로 설정한다.
- console을 찍어보면 값이 잘 세팅된 것을 볼 수 있다.
3. 가장 많이 발생한 순서대로 정렬한다.
console.log("1 :", m)
m = [...m].sort((a,b)=>b[1]-a[1]);
console.log("2 :", m)
// 1 : Map(4) {1 => 1, 2 => 1, 3 => 3, 4 => 1}
// 2 : 0:[3, 3], 1:[1, 1], 2:[2, 1], 3:[4, 1]
- sort하기 위해 스프레드 문법을 사용한다.
- 각 배열의 1번 인덱스(즉, 발생 빈도) 값을 비교하여 오름차순으로 정렬한다.
4. 값을 비교하여 결과 반환
return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
// m[0][1] => 3
// m[1][1] => 1
// m[0][0] => 3
- 1. m의 값이 1개일 경우(주어진 배열이 1개일 경우), 첫 번째 값을 반환
- 2. m의 첫 번째 요소의 1번째 인덱스 값이 두 번째 요소의 1번째 인덱스 값보다 클 경우, 첫 번째 값을 반환
- 3. 위 두 가지 경우 모두 아닐 경우 -1 반환
다른 사람의 풀이
const solution = (array) => {
const counter = array.reduce((acc, cur) => ({
...acc,
[cur]: (acc[cur] || 0) + 1
}), {})
const items = Object.keys(counter).map((key) => [
Number(key), counter[key]
]).sort((a, b) => b[1] - a[1])
if (items[0][1] === items?.[1]?.[1]) {
return -1
}
return items[0][0];
}
reduce를 활용하는 법도 있다...~
'Javascript' 카테고리의 다른 글
[Javascript] express로 proxy 서버 구축하고 CloudType에 배포하기 (0) | 2023.06.18 |
---|---|
[Javascript] 함수 레벨 스코프와 블록 레벨 스코프, 렉시컬 스코프 차이 이해하기 (0) | 2023.02.06 |
[Javascript] 최대공약수, 최소공배수는 유클리드 호제법으로! (0) | 2022.11.19 |
Comments