
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
| array | result |
|---|---|
| [1, 2, 3, 3, 3, 4] | 3 |
| [1, 1, 2, 2] | -1 |
| [1] | 1 |
입출력 예 #1
[1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.
입출력 예 #2
[1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
입출력 예 #3
[1]에는 1만 있으므로 최빈값은 1입니다.
function solution(array) {
let answer = 0;
let res = new Array(1000);
res.fill(0);
for(let i = 0; i < array.length; i++)
res[array[i]] += 1;
let max = Math.max(...res);
let count = 0;
for(let i = 0; i < res.length; i++) {
if(max === res[i]) {
answer = i;
count++;
}
if(count >= 2) return -1;
}
return answer;
}
사실 내 코드는 let res = new Array(1000)
제한사항에 맞게 배열의 사이즈를 고정하였기 때문에 엄청난 공간 낭비를 발생한다.
그래도 설명해보자면,
처음에 배열을 한번에 0으로 초기화 하고 싶었다. for문으로 연산되는 낭비를 줄이고자 알아본 결과 fill()이라는 배열 메서드가 있었다.
배열을 한번에 0으로 초기화 시켰다. res.fill(0);
그러고 for문 안에 res 배열 인덱스에다 배열 매개변수(array)의 값을 넣었고, 1씩 더해주는 형태로 작성했다. res[array[i]] += 1;
그렇게 하면 예를 들어 [1, 2, 3, 3, 3, 4]가 배열 매개변수라고 하면,

res 배열은 이렇게 값이 채워진다.
그 다음 res 배열에서 가장 큰 값을 max 변수에다 넣는다.
let max = Math.max(...res);
res 배열에서 max 값과 같은 경우에 answer 변수에다 인덱스 값을 넣었다.
if(max === res[i]) {
answer = i;
count++;
}
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 객체를 활용해본 적이 없어서 어떻게 사용하는지 잘 모르겠다.
이 코드를 해석하면서 개념을 정리해봐야겠다.
맵(Map)은 키-값이 있는 데이터를 저장한다는 점에서 객체와 유사하다고 한다.
다음 아래는 Map 객체의 주요 메서드가 있다.
위의 개념을 통해서 위의 코드를 해석해보자면,
m.get(n) n의 값이 존재하지 않으면 undefined가 나오게 된다.
만약 m.get(n)이 undefinded라면, m.get(n) || 0에서
undefinded || 0은 0이 된다. 5. undefined를 렌더링하지 않기 참고
for (let n of array) m.set(n, (m.get(n) || 0)+1); 이 코드의 예를 한번 들어보겠다. array = [1, 2, 3, 3, 3, 4]라고 하자.
for문
1. array[0]: m.set(1, (undefined || 0)+1) { 1 => 1 }
2. array[1]: m.set(1, (undefined || 0)+1) { 1 => 1, 2 => 1 }
3. array[2]: m.set(3, (undefinded || 0)+1 { 1 => 1, 2 => 1, 3 => 1 }
4. array[3]: m.set(3, (1 || 0)+1 { 1 => 1, 2 => 1, 3 => 2 }
5. array[4]: m.set(3, (2 || 0)+1 { 1 => 1, 2 => 1, 3 => 3 }
6. array[5]: m.set(4, (undefinded || 0)+1 { 1 => 1, 2 => 1, 3 => 3, 4 => 1 }
최종적으로 m = { 1 => 1, 2 => 1, 3 => 3, 4 => 1 }이 된다.
그 다음 코드를 살펴보자.
[...m].sort((a,b)=>b[1]-a[1])은 객체를 배열로 풀어 나열한 후 정렬한 것이다.
// [...m]의 결과
[
[1, 1],
[2, 1],
[3, 3],
[4, 1]
]
sort((a, b) => b - a))는 내림차순이라고 배웠다. sort() - 오름차순, 내림차순
그런데 sort((a, b) => b[1] - a[1]))은 뭘까? sort((a, b) => b[0] - a[0]))이랑 차이가 뭘까?
알아보니 m은 키-값으로 구성된 객체이기 때문에 값을 기준으로 내림차순을 한 것이다.
그래서 [...m].sort((a,b)=>b[1]-a[1]) 이 코드의 결과는
[
[3, 3],
[1, 1],
[2, 1],
[4, 1]
]
이렇게 나온다.