문자열 데이터를 다루다 보면 특정 값이 몇 번이나 등장하는지 세어야 하는 경우가 자주 있습니다. 이번 글에서는 쉼표(,)로 구분된 과일 이름 문자열에서 가장 많이 등장하는 과일을 찾는 JavaScript 함수를 만들어 보겠습니다.
문제 상황
다음과 같이 쉼표로 구분된 과일 이름 문자열이 있다고 가정해 보겠습니다.
const str = 'Banana,Banana,Pear,Orange,Apple,Melon,Grape,Apple,Banana,Grape,Melon,Grape,Melon,Apple,Grape,Banana,Orange,Melon,Orange,Banana,Banana,Orange,Pear,Grape,Orange,Orange,Apple,Apple,Banana';
우리가 작성할 함수는 이러한 문자열을 입력받아, 반복문을 활용해 어떤 과일 이름이 문자열에서 가장 많은 횟수로 등장하는지 찾아내야 합니다.
해결 코드
다음은 문제를 해결하는 JavaScript 코드입니다.
const str =
'Banana,Banana,Pear,Orange,Apple,Melon,Grape,Apple,Banana,Grape,Melon,Grap
e,Melon,Apple,Grape,Banana,Orange,Melon,Orange,Banana,Banana,Orange,Pear,G
rape,Orange,Orange,Apple,Apple,Banana';
const findMostFrequent = str => {
const strArr = str.split(',');
const creds = strArr.reduce((acc, val) => {
if(acc.has(val)){
acc.set(val, acc.get(val) + 1);
}else{
acc.set(val, 1);
};
return acc;
}, new Map());
return Array.from(creds).sort((a, b) => b[1] - a[1])[0][0];
};
console.log(findMostFrequent(str));코드 동작 원리
이 함수의 핵심 로직을 단계별로 살펴보겠습니다.
1. 문자열 분리
split(',') 메서드를 사용해 쉼표를 기준으로 문자열을 배열로 분리합니다. 각 과일 이름이 배열의 개별 요소가 됩니다.
2. Map으로 빈도수 집계
reduce() 메서드와 Map 객체를 조합해 각 과일의 등장 횟수를 집계합니다. 이미 Map에 해당 과일이 존재하면 기존 값에 1을 더하고, 없으면 새로 추가하며 값을 1로 설정합니다.
3. 최빈값 추출
Array.from()으로 Map을 배열로 변환한 뒤, 등장 횟수를 기준으로 내림차순 정렬하고 첫 번째 요소의 과일 이름을 반환합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
Banana
예제 문자열에서 'Banana'는 총 8번 등장하여 다른 과일보다 가장 많은 빈도를 기록했기 때문에 최종 결과로 반환됩니다.