LV0에 있길래 과감하게 덤볐다가 나의 부족함을 느끼게 해준 최빈값 구하기..
프로그래머스_최빈값 구하기 풀이 기록을 위해 포스팅합니다..도움을 주신 a.k.a 감자전, 운도님 감사합니다,,
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
array | result |
---|---|
[1,2,3,3,3,4] | 3 |
[1,1,2,2] | -1 |
[1] | 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
을 사용하여 새로운 객체를 생성합니다.let m = new Map();
for ~ of
로 배열을 순회하면서 각 요소의 빈도를 계산합니다. 이미 Map
에 존재하면 그 값을 가져오고, 없으면 0을 기본값으로 사용합니다.for(let n of array) {
m.set(n, (m.get(n) || 0)+1);
}
m
을 배열로 변환하고 value
인 빈도수를 기준으로 내림차순으로 정렬합니다.m = [...m].sort((a,b)=>b[1]-a[1]);
m
의 길이가 1인 경우는 그 요소를 반환하고 가장 많이 등장하는 요소의 빈도가 두 번째로 많이 등장하는 요소의 빈도보다 큰 경우는 가장 많이 등장하는 경우의 빈도를 반환합니다. 가장 많이 등장하는 요소가 동률인 경우는 -1을 반환합니다.function solution(array) {
let obj = {};
for (let ele of array) {
if (!obj.hasOwnProperty(ele)) {
obj[ele] = 1;
} else {
obj[ele]++;
}
}
let maxCount = 0;
let answer = [];
for (let prop in obj) {
if (obj[prop] > maxCount) {
maxCount = obj[prop];
answer = [Number(prop)];
} else if (obj[prop] === maxCount) {
answer.push(Number(prop));
}
}
if (answer.length > 1) {
return -1;
}
return answer[0];
}
let obj = {};
hasOwnProperty
메서드를 사용하여 객체에 요소가 존재하지 않으면 1로 초기화, 존재하면 빈도를 1증가시킵니다.for (let ele of array) {
if (!obj.hasOwnProperty(ele)) {
obj[ele] = 1;
} else {
obj[ele]++;
}
}
maxCount
와 최대 빈도수를 가진 요소들을 저장할 배열 answer
을 생성합니다.let maxCount = 0;
let answer = [];
maxCount
보다 크면 maxCount
를 갱신하고 answer
를 해당 요소로 초기화합니다. 객체 obj의 프로퍼티 값이 maxCount
와 동일하면 answer
배열에 추가합니다.for (let prop in obj) {
if (obj[prop] > maxCount) {
maxCount = obj[prop];
answer = [Number(prop)];
} else if (obj[prop] === maxCount) {
answer.push(Number(prop));
}
}
answer
의 길이가 1보다 크면 -1을 반환하고 그렇지 않으면 answer[0]을 반환합니다.if (answer.length > 1) return -1;
return answer[0];
다시한번 Thanks to 감자전, 운도님🙇🏻🙇🏻🙇🏻