728x90
1. 문제
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해 보세요. 최빈값이 여러 개면 -1을 return 합니다.
1) 내 코드
function solution(array) {
let obj = {};
//겹치는 숫자 count
array.forEach(num => {
if(obj[num] === undefined) obj[num] = 1
else obj[num] = obj[num]+1
})
let max = Math.max.apply(null, Object.values(obj));
let maxAll = Object.keys(obj).filter(key => obj[key] === max)
if(maxAll.length > 1) return -1
else return Number(maxAll[0])
}
solution([1, 2, 3, 3, 3, 4])
최빈값이 어떤 것인지 구하는 문제이다.
array.forEach(num => {
if(obj[num] === undefined) obj[num] = 1
else obj[num] = obj[num]+1
})
우선, 각 요소가 몇번씩 출력되는지 찾기 위해서 forEach를 통해서 겹치는 숫자를 카운트해 줬다.
key로 요소를 넣어주고, value로 요소의 개수를 넣어줬다.
let max = Math.max.apply(null, Object.values(obj));
그 후 Math.max.apply를 사용해 object의 value 중 가장 큰 값을 찾아준다.
let maxAll = Object.keys(obj).filter(key => obj[key] === max);
object 중에서 max 값을 가지고 있는 것들을 배열로 출력해 준다.
if(maxAll.length > 1) return -1
else return Number(maxAll[0])
마지막으로 maxAll이 1개 이상이면, 최빈값이 여러 개라는 의미이므로 -1을 리턴하고,
그렇지 않다면 MaxAll [0] 번째 값을 리턴해준다.
이때 value는 string 타입으로 저장되어 있으므로 Number를 통해 숫자로 바꿔준다.
*Object.values
객체의 value를 배열로 리턴하는 메서드.
*apply
this에 새로운 객체를 바인딩할 때 사용하는 메서드.
apply()를 이용해 작성된 메서드를 다른 객체에 상속할 수 있다.
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;
}
다른 사람들 풀이를 보니까 Map을 사용한 사람들이 있더라.. 이렇게 풀 수도 있다는 걸 느꼈다.
매번 익숙한 방식으로 푸니까 다른 방법은 잘 생각하지 못하게 되는 것 같다.
다양한 풀이법을 보고 익숙해지도록 노력해야겠다
728x90
반응형
'Algorithm > 문제' 카테고리의 다른 글
[코딩테스트] 중복순열 구하기 (feat. javascript) (0) | 2024.02.22 |
---|---|
[인프런 코딩테스트] 이진트리(깊이 우선 탐색)로 부분집합 구하기, DFS (0) | 2024.02.20 |
[인프런 코딩테스트] 뮤직비디오, 결정 알고리즘 (feat. 이분탐색 응용, javascript) (1) | 2024.01.26 |
[인프런 코딩테스트] 마구간 정하기, 결정 알고리즘 (feat. 이분탐색 응용, javascript) (2) | 2024.01.25 |
[CodingTest] 쇠막대기, Stack (1) | 2024.01.05 |