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을 이용한 풀이네요
제 풀이보다 더 깔끔한 것 같습니다.
반응형