이번 글에서는 문자열을 입력받아 각 문자(요소)가 몇 번 등장했는지를 나타내는 빈도 분포(frequency distribution) 객체를 반환하는 JavaScript 함수를 작성하는 방법을 알아보겠습니다.
문제 정의
다음과 같은 문자열이 있다고 가정해 보겠습니다.
const str = 'This string will be used to calculate frequency distribution';
우리가 만들어야 할 함수는 이 문자열을 분석하여, 각 문자가 키(key)가 되고 해당 문자의 등장 횟수가 값(value)이 되는 객체를 반환해야 합니다. 공백 역시 하나의 요소로 계산된다는 점에 유의하세요.
구현 코드
핵심 아이디어는 간단합니다. 문자열을 한 글자씩 순회하면서 각 문자의 등장 횟수를 객체에 누적하는 것입니다. 이때 논리 연산자 ||(OR)를 활용하면 코드를 깔끔하게 작성할 수 있습니다.
- 문자가 이미 객체에 존재하면 → 기존 값에 1을 더함
- 문자가 처음 등장했다면 →
undefined || 0이 되어 0 + 1 = 1로 초기화됨
const str = 'This string will be used to calculate frequency
distribution';
const frequencyDistribution = str => {
const map = {};
for(let i = 0; i < str.length; i++){
map[str[i]] = (map[str[i]] || 0) + 1;
};
return map;
};
console.log(frequencyDistribution(str));출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 빈도 분포 객체가 출력됩니다.
{
T: 1,
h: 1,
i: 6,
s: 4,
' ': 8,
t: 5,
r: 3,
n: 3,
g: 1,
w: 1,
l: 4,
b: 2,
e: 5,
u: 4,
d: 2,
o: 2,
c: 3,
a: 2,
f: 1,
q: 1,
y: 1
}결과 해석
출력 결과를 보면 공백(' ')이 8번으로 가장 많이 등장했으며, 그다음으로는 i(6회), t와 e(각 5회) 순으로 자주 사용된 것을 확인할 수 있습니다. 대소문자는 서로 다른 키로 구분되므로, 대문자 T와 소문자 t는 별개로 집계됩니다.
만약 대소문자를 구분하지 않고 싶다면 str.toLowerCase()를 적용한 뒤 함수에 전달하면 됩니다. 이처럼 단순한 반복문 하나로 문자열 내 모든 요소의 빈도 분포를 손쉽게 계산할 수 있습니다.