최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
numer1 | denom1 |
---|---|
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
-[1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
-[1]에는 1만 있으므로 최빈값은 1입니다.
function solution(array) {
let sortedArray = array.sort((a, b) => a - b);
let cnt = 0;
let choi = -1; //최빈값
let choiRepeatCnt = 0; //최빈값이 될때 몇 번 반복했는지
let repeatCnt = 0; // 현재 같은 숫자가 몇번 등장
let beforeNumber = -1; //지금 보고 있는 숫자 어떤 숫자
let isDupChoi = false;
while (cnt < array.length) {
if (beforeNumber !== array[cnt]) {
repeatCnt = 1;
} else {
repeatCnt = repeatCnt + 1;
}
if (repeatCnt === choiRepeatCnt) {
if (choi !== array[cnt]) {
isDupChoi = true;
}
}
if (repeatCnt > choiRepeatCnt) {
choi = array[cnt];
choiRepeatCnt = repeatCnt;
isDupChoi = false;
}
beforeNumber = array[cnt];
cnt = cnt + 1;
}
if (isDupChoi) return -1;
return choi;
}
// 메모리 너무 잡아먹지만 이런 연습 더욱 해보기
//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;
}
//2
function solution(array) {
// array의 최댓값만큼의 길이를 가진 새로운 배열 생성
let newArray = new Array(Math.max(...array) + 1).fill(0);
// array 반복문을 통해, 해당 값에 해당하는 index의 값 += 1
for (let i = 0; i < array.length; i++) {
newArray[array[i]] += 1;
}
// newArray의 최댓값에 해당 하는 index 출력
// 만약 indexOf와 lastIndexOf가 지칭하는 값이 같으면, -1 출력 (중복인 경우 확인)
if (
newArray.indexOf(Math.max(...newArray)) !==
newArray.lastIndexOf(Math.max(...newArray))
) {
return -1;
} else {
return newArray.indexOf(Math.max(...newArray));
}
}
// arr.fill(value[, start[, end]])