최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array
가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
array
의 길이 < 100array
의 원소 < 1000array | result |
---|---|
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
※ 공지 - 2022년 10월 17일 제한 사항 및 테스트케이스가 수정되었습니다.
💡 문제풀이 과정
- 주어진 배열
array
의 원소들과 중복값이 제거된 배열을 만들어 같으면 각각의 원소가 같으면count++
해주기로 한다. 따라서 중복값을 제거한 배열을[…new Set(array)]
를 통해 만들어 준다.setArr
라는 빈 배열에 중복 제거된 원소들과 카운트할 원소를 함께 넣어주기로 한다.setArr
의 원소의인덱스 0은 array에서 가져온 원소(정수)
가 되고,인덱스 1은 count할 자연수
가 들어간다. 즉,[[array원소1, count], [array원소2, count]]
와 같은2차원 배열
의 형태가 된다. (다음 코드 참고)
let setArr = []; let count = 0; [...new Set(array)].map((v) => setArr.push([v, count]));
- 다음은,
for()
반복문을 중복으로 사용하여array[i]
와setArr[j][0]
을 비교하여 같으면setArr[j][1]++
한다.
for (let i = 0; i < array.length; i++) { for (let j = 0; j < setArr.length; j++) { if (array[i] == setArr[j][0]) setArr[j][1]++; } }
- 다음은,
setArr
를count
가 들어있는 원소를 기준으로내림 차순
정렬한다. 즉, 제일 카운트가 높은 순서대로 정렬하여 맨 위의 원소가최빈값
이 들어있는 원소가 된다.setArr.sort((a, b) => b[1] - a[1]);
- 마지막으로는, 조건문을 통해 세 가지 조건을 만든다.
- 만약 주어진 배열
array의 원소가 1개
인 경우 혹은setArr의 원소가 하나
인 경우에는array[0]
를 리턴한다. 만약 주어진array
가[1, 1, 1, 1]
인 경우에는new Set(array)
을 이용하여 중복 제거했을 때 배열의 원소가 하나만 남기때문이다.최빈값이 여러 개일 경우
이다.setArr
에 담긴첫 번째 원소의 카운트 값
과두 번째 원소의 카운트 값
이 같을 경우-1
을 리턴한다. (sort()
를 통해 카운트값을 기준으로 내림 차순했기 때문에, 첫 번째 원소와 두 번째 원소만 비교하면 된다.)- 위 2가지 경우를 제외하고 나머지는
setArr
에 담긴첫 번째 원소의 정수
를 리턴하면 된다. (이 역시sort()
를 통해 내림 차순 정렬하였기 때문에 첫 번째 원소가최빈값
이 된다.)if (array.length == 1 || setArr.length == 1) return array[0]; else if (setArr[0][1] == setArr[1][1]) return -1; else return setArr[0][0];
- 답안 2번의 경우 다른 사람의 풀이를 가져왔는데,
new Map()
과 관련 메소드를 사용하여 풀이한 것이 인상 깊다.
✅ 답안 #1
function solution(array) {
let setArr = []
let count = 0;
[...new Set(array)].map((v) => setArr.push([v, count]));
for (let i = 0; i < array.length; i++) {
for (let j = 0; j < setArr.length; j++) {
if (array[i] == setArr[j][0]) setArr[j][1]++;
}
}
setArr.sort((a, b) => b[1] - a[1]);
if (array.length == 1 || setArr.length == 1) return array[0];
else if (setArr[0][1] == setArr[1][1]) return -1;
else return setArr[0][0];
}
✅ 답안 #2
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;
}