문제 개요
이번 글에서는 문자열을 인자로 받아, 해당 문자열에서 두 번째로 많이 등장하는 문자를 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
const str = 'This string will be used to calculate frequency';
위 문자열에서 가장 많이 등장하는 문자를 제외하고 두 번째로 자주 나타나는 문자는 'e'입니다.
해결 접근 방식
이 문제는 다음 세 단계로 해결할 수 있습니다.
1. 문자열을 한 글자씩 분리합니다.
2. Map 객체를 활용해 각 문자의 등장 횟수를 집계합니다.
3. 빈도순으로 내림차순 정렬한 뒤, 두 번째 요소의 문자를 반환합니다.
전체 코드 예제
이제 완성된 코드를 살펴보겠습니다.
const str = 'This string will be used to calculate frequency';
const secondMostFrequent = str => {
const strArr = str.split('');
const map = strArr.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(str));코드 설명
split('') 메서드는 문자열을 개별 문자로 이루어진 배열로 변환합니다. 이후 reduce()와 Map 객체를 조합하여 각 문자가 몇 번 등장했는지 빈도를 누적 집계합니다. 이미 존재하는 문자라면 기존 값에 1을 더하고, 처음 등장한 문자라면 1로 설정합니다.
집계가 끝난 Map은 Array.from()을 통해 [문자, 빈도] 형태의 배열로 변환되며, sort()로 빈도를 기준으로 내림차순 정렬합니다. 정렬된 배열의 인덱스 1(두 번째 위치)에 있는 문자를 반환하면 원하는 결과를 얻을 수 있습니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
e
이처럼 Map과 배열 메서드를 활용하면 복잡한 반복문 없이도 간결하게 문자 빈도 분석 문제를 해결할 수 있습니다.