이번 글에서는 배열을 입력받아 그중 두 번째로 자주 등장하는 요소를 반환하는 JavaScript 함수를 작성하는 방법을 알아보겠습니다.
예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.
const arr = [1, 34, 4, 3, 2, 1, 4, 6, 4, 6, 5, 3, 6, 6];
위 배열에서 가장 많이 등장하는 요소는 다음과 같습니다.
6
하지만 우리가 원하는 결과는 두 번째로 자주 등장하는 요소, 즉 아래의 값입니다.
4
구현 로직
함수의 동작 순서는 다음과 같습니다.
1. reduce() 메서드와 Map 객체를 활용해 각 요소의 등장 횟수를 집계합니다.
2. Array.from()으로 Map 객체를 [요소, 빈도수] 형태의 배열로 변환합니다.
3. 빈도수를 기준으로 내림차순 정렬한 뒤, 인덱스 1(두 번째)에 해당하는 요소를 반환합니다.
코드 예제
const arr = [1, 34, 4, 3, 2, 1, 4, 6, 4, 6, 5, 3, 6, 6];
const secondMostFrequent = arr => {
// Map 객체를 이용해 각 요소의 등장 횟수 계산
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);
// Map을 [키, 값] 배열로 변환 후 빈도수 기준 내림차순 정렬
const frequencyArray = Array.from(map);
return frequencyArray.sort((a, b) => {
return b[1] - a[1];
})[1][0];
};
console.log(secondMostFrequent(arr));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
4
코드 설명
reduce() 단계에서는 초기값으로 새로운 Map 객체를 생성하고, 배열을 순회하면서 이미 존재하는 키라면 기존 값에 1을 더하고, 없다면 1로 설정합니다. 이렇게 하면 각 요소별 등장 횟수가 깔끔하게 정리됩니다.
이후 Array.from(map)을 호출하면 [[1, 2], [34, 1], [4, 3], ...]과 같은 2차원 배열이 만들어집니다. 여기에 sort()를 사용해 두 번째 원소(빈도수)를 기준으로 내림차순 정렬하면, 가장 빈번한 요소가 맨 앞에 위치하게 됩니다. 최종적으로 인덱스 [1][0]에 접근하여 두 번째로 자주 등장한 요소의 값을 얻을 수 있습니다.
이 방식은 시간 복잡도가 O(n log n)이며, 코드가 간결해서 실무에서도 손쉽게 활용할 수 있습니다.