🔑단 한사람이라도 내가 작성한 글을 봐준다면, 글을 작성할 이유는 충분하다
💡 프로그래머스 최빈값 구하기
📃 최근에 프로그래머스 코딩 테스트 기초문제들을 모두 끝내고 입문 문제로 왔는데, 레벨이 0인데 생각보다 난이도가 있지 않은가 생각이 드네요. 저의 실력 문제겠죠?ㅎㅎ
➡️문제는 다음과 같습니다. 최빈값을 구하는 문제인데, 몇일전에 당근에서 라이브코딩때 진행했던 문제와 유사한 부분이 있어서 한번 다뤄볼려합니다.
💡 문제 풀이
📃 다양한 접근 방법이 있을 것 같은데, 일단은 reduce를 통해서 각각 숫자를 객체값으로 저장을 해주면 좋을 것 같아요
➡️일단 reduce함수는 실무에서도 자주 사용되는 것으로 알고 있는데, 누산기 accumulator라는 누산기를 사용합니다. reduce함수는 주어진 배열을 순회하며, "누산기"를 통해 값을 누적합니다
💻CODE
function sumArray(array){
return array.reduce((acc, num) => acc + num, 0)
}
console.log(sumArray([1,2,3,4,5])); // 15
⬆️ 일단 reduce 는 첫번째 인수로 callback 함수를 받습니다, 우리는 익명함수로 (acc, num) => acc + num 정의해주었고, acc에 값이 누적됩니다. 그 다음으로 오는 인수 0은 초기값을 의미합니다. 다음을 통해 reduce함수는 array를 순회하고 결과적으로 15라는 값을 반환합니다
💻CODE
function solution(array) {
const frequency = array.reduce((acc, num) => {
acc[num] = (acc[num] || 0) + 1;
return acc;
}, {})
}
⬆️우리는 초기값으로 빈객체를 설정해주었고, reduce 함수는 초기값으로 num = 1을 가지고 옵니다. acc[1] = (acc[num] || 0) 에서 acc[num] 값은 undefined로 0이 반환되고, 0 + 1이 되기 때문에, acc[1] = 1 ,고로 { 1: 1 } 이 됩니다
💻CODE
function solution(array) {
const frequency = array.reduce((acc, num) => {
acc[num] = (acc[num] || 0) + 1;
return acc;
}, {})
const maxFrequency = Math.max(...Object.value(frequency)); // 구조분해할당 //
}
⬆️ 우리는 객체 안에서 어떤 값이 가장 많은 빈도수를 가지고 있는지, Math.max를 통해서 찾아야합니다. 근데 frequency는 객체값이죠? 구조분해할당을 통해 value값만 뽑아줍니다.
💻CODE
function solution(array) {
...
const answer = Object.entries(frequency)
.filter([key, value] => value === maxFrequency)
.map(([key]) => Number(key));
}
⬆️우리는 객체로 저장되어 있는 데이터를 Object.entries() 함수를 사용하여 배열로 변환합니다.
이 배열은 [key, value] 형태로 각 항목을 다룹니다.
그 이후에는 각 [key, value] 쌍을 순회하면서 value 값을 사전에 정의한 maxFrequency와 비교하여, 해당하는 값만 필터링합니다.
이렇게 필터링된 값들 중에서 key만 필요하기 때문에, map()을 사용하여 각 요소에서 key를 추출합니다.
💻CODE
function solution(array) {
...
return answer.length > 1 ? -1 : answer[0]
}