나의 답
function solution(array) {
let res = {};
array.forEach((i) => {
res[i] = (res[i] || 0) + 1;
});
let maxFreq = 0; //가장 높은 빈도
let mostFrequentValues = [];
//최대빈도 찾기
for (const freq of Object.values(res)) {
if (freq > maxFreq) {
maxFreq = freq;
}
}
//최대 빈도를 가지는 값들 수집
for (const [value, freq] of Object.entries(res)) {
if (freq === maxFreq) {
mostFrequentValues.push(Number(value));
}
}
/**
* Object.entries(res))로 res 객체의 카-값 쌍을 가져온다
* 각 쌍의 빈도와 최대 빈도 같으면 mostFrequentValues 배열에 추가
*/
if (mostFrequentValues.length > 1) {
return -1; //배열에 값이 여러 개 있으면 -1을 반환
}
return mostFrequentValues[0]; //유일한 최빈값
}
위의 코드를 작성하는 것만으로 꽤 많은 시간을 소모했는데
다른 사람의 풀이를 보니까 간단명료하고 직관적으로 작성되어있어 공부겸 가져왔다.
function solution(array) {
let m = new Map(); //각 값의 빈도
for (let n of array) m.set(n, (m.get(n) || 0)+1);
/**
* 배열의 요소를 순회, 빈도 증가
* m.get(n) || 0는 현재 값 n의 빈도를 가져오며, 아직 Map에 없는 값이면 0을 반환
*/
m = [...m].sort((a,b)=>b[1]-a[1]);
/**
* Map 객체 m을 배열로 변환 후 sort
* a는 element, b는 횟수
* b[1] - a[1] 은 빈도를 기준으로 내림차순 정렬
* 정렬 후 m은 배열 형태로 변경, 요소는 '[값,빈도]' 형태의 배열
*/
return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
/**
* 배열이 길이가 1이면 해당 값 반환
* 아니면, 가장 높은 빈도 (m[0][1])가 두 번째로 높은 빈도 (m[1][1])보다 큰 경우,
* ㄴ 0인건 array index가 0부터 시작하니까
* 즉 최빈값이 유일한 경우 해당 값을 반환합니다.
* 그렇지 않으면 최빈값이 여러 개이므로 -1을 반환합니다.
*/
}
같은 결과를 구하는데 이렇게 다르다니... 놀랍다.