반응형
이 문제 상당히 난감했다. 해답을 보고도 아하! 라며 바로 이해하기 보단 한줄한줄 따라가며 읽어야지만 눈에 들어와서
따로 디테일한 공부 없이 뇌빼고 코딩했던 나같은 사람들한테는 진입장벽이 조금 높을 수도 있겠다는 생각이 들었다.
문제 : 최빈값 구하기
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
- 0 < array의 길이 < 100
- 0 ≤ array의 원소 < 1000
입출력 예
arrayresult[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
이런 식으로 배열 내에 중복된 요소가 가장 많은 값을 찾는 것이었는데,
그럼 각 요소마다 카운트를 어떻게 하는가 라는 고민을 하게 만들었다.
배열 안에 어떤 요소가 들어올지도 모르니 말이다.
결국 답을 찾아봤는데, Map을 사용해 key:value로 가지고 있는 방법을 다들 쓰고 있었다.
function solution(array) {
let m = new Map();
array.map(item => {
m.set(item, (m.get(item) || 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;
}
1. Map 객체를 만들어 array 안의 요소를 key로 사용, 해당 키를 사용해 루프를 돌 때마다 해당 키를 가진 요소가 있으면 value에 +1을 해서 set을 해준다.
2. 그렇게 만들어진 Map 객체를 value의 크기에 따라 내림차순 정렬
3. 요소가 하나 뿐이거나, 두번째 key값에 대한 value보다 첫번째 key값에 대한 value가 크다면 첫번째 key값을 리턴, 그 외에는 최빈수가 중복인 것이니 -1을 리턴
이러한 로직이었다. 솔직히 이해는 됐는데 과연 실전에서 써먹을 생각을 할 수 있을까라는 의문이 든다..
LIST
'Dev > Algorithm' 카테고리의 다른 글
[코딩테스트] 다항식 더하기 (0) | 2023.05.17 |
---|---|
[Algorithm] 큐와 스택(Queue, Stack) 그리고 트리(Tree) (0) | 2023.04.17 |
[코딩테스트] 직각삼각형 출력하기 (0) | 2023.04.14 |
[코딩테스트] 분수의 덧셈 (0) | 2023.04.14 |
[코딩테스트]등수 매기기 (0) | 2023.04.14 |