문제 소개
자바스크립트에서 배열을 입력받아 그중 두 번째로 많이 등장하는 요소를 반환하는 함수를 작성해 보겠습니다. 이 문제는 각 요소의 출현 빈도를 계산한 뒤, 빈도수를 기준으로 정렬하여 두 번째 값을 추출하는 방식으로 해결할 수 있습니다.
해결 접근 방법
reduce()메서드와Map객체를 활용해 배열 내 각 요소의 출현 횟수를 집계합니다.Array.from()으로 Map 객체를[요소, 빈도]형태의 배열로 변환합니다.- 빈도수를 기준으로 내림차순 정렬한 뒤, 인덱스 1에 해당하는 요소를 반환합니다.
코드 구현
const arr = [5, 2, 6, 7, 54, 3, 2, 2, 5, 6, 7, 5, 3, 5, 3, 4];
const secondMostFrequent = arr => {
const map = arr.reduce((acc, val) => {
if(acc.has(val)){
acc.set(val, acc.get(val) + 1);
}else{
acc.set(val, 1);
};
return acc;
}, new Map);
const frequencyArray = Array.from(map);
return frequencyArray.sort((a, b) => {
return b[1] - a[1];
})[1][0];
};
console.log(secondMostFrequent(arr));
코드 동작 원리
reduce()는 배열을 순회하면서 각 요소가 이미 Map에 존재하면 해당 빈도를 1씩 증가시키고, 없으면 새로 추가합니다. 이렇게 완성된 Map은 Array.from()을 통해 [값, 빈도] 쌍의 2차원 배열로 변환됩니다.
이후 sort((a, b) => b[1] - a[1])로 빈도수를 기준으로 내림차순 정렬하면 가장 많이 등장한 요소가 첫 번째 위치에 오게 됩니다. 마지막으로 [1][0]을 통해 두 번째 위치의 요소 값만 추출하여 반환합니다.
예시 배열에서는 5가 4번으로 가장 많이 등장하고, 그다음으로 2가 3번 등장했기 때문에 결과는 2가 됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
2