[Algorithm] 연습문제 - 최빈값 구하기
주어진 배열에서 가장 자주 나오는 값을 찾는 문제
프로그래머스 코딩테스트 입문 - 최빈값 구하기
지금까지 문제풀면서 어떤 값이 몇번 반복되는지 카운트가 필요한 경우
이중배열을 만들어서 해결했었다.
객체를 활용한건 처음이라 공부하고 글로 정리해본다.
최빈값 구하기
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다.
정수 배열 array
가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요.
최빈값이 여러 개면 -1을 return 합니다.
배열의 중복 값 개수 구하기
여러 방법들이 있지만, 별도의 빈 객체 선언 필요없이 바로 정리할 수 있는 reduce를 이용했다.
배열 자료 합계낼때만 사용했는데 이렇게도 쓸 수 있다는걸 배웠다.
reduce()
배열의 요소들을 순회하면서 각각 callback 함수를 실행하여 특정 형태로 누적한 값을 반환한다.
arr.reduce((acc, cur) => { callback }, init)
그리고 객체를 동적으로 만들고 접근하는 방법이 생소해서 자료를 더 찾아보고 공부했다.
객체의 속성에 접근하는 방법은 두 가지가 있다. (도움글)
dot notation 점 표기법obj.keyName
square bracket notation 대괄호 표기법obj[keyName]
동적인 접근을 위해서는 대괄호 표기법이 필요하다.
1
2
3
4
5
6
7
8
9
function solution(array) {
let count = array.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) + 1;
// key가 cur인것의 값에 1을 더하던가, 아니면 0에 1을 더해라
// 속성이 생성되기전엔 값이 NaN로 되어있기때문에, 초기값 0을 셋팅하는 조건이 필요함
return acc;
// 누적된 acc 객체를 반환
}, {}); // 초기값을 객체로 설정
}
객체의 속성 읽어와 가장 개수가 많은 값 찾기
객체에서는 Math.max()
등을 바로 사용할 수 없기 때문에
Object.keys(arr)
와 Object.values(arr)
로 각각의 값을 저장 후 원하는 가공을 해야했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function solution(array) {
let count = array.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) + 1;
return acc;
}, {});
let maxVal = Math.max(...Object.values(count));
// 앞서 구한 객체에서 value 들을 뽑아와 펼치고, max 값을 찾아 변수로 저장
let maxKey = Object.keys(count).filter((key) => count[key] == maxVal);
// 이번에는 객체의 key 들을 뽑아서 그 값이 maxVal 인 키만 남겨 리턴한다.
// filter는 주어진 함수의 조건을 통과하는 요소를 모아 새로운 배열로 반환한다.
// 이때 maxKey는 ["3"]의 형태로 저장된다. (key는 string 타입이니까)
return maxKey.length > 1 ? -1 : Number(maxKey);
// maxKey 배열의 요소가 한개 이상이면 -1을 반환하고, 아니면 maxKey를 숫자로 바꿔서 반환한다.
}
글로 정리하고 보니 레벨0 문제인만큼 심플한데
찾아가는 과정은 심플하지 않았다는 슬픈 이야기
Leave a comment