JavaScript에서 공백으로 구분된 문자열이 주어졌을 때, 각 요소(문자)가 몇 번 등장하는지 계산해야 하는 경우가 자주 있습니다. 예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
const str = 'a b c d a v d e f g q';
여기서 우리는 이러한 문자열을 입력으로 받아, 각 문자와 그 등장 횟수를 담은 객체 배열(빈도 배열)을 반환하는 JavaScript 함수를 작성해야 합니다. 결과는 빈도수가 높은 순서대로 정렬하면 더 유용합니다.
구현 방법
핵심 아이디어는 다음과 같습니다.
- 문자열을
split(" ")으로 분리하여 개별 단어(문자) 배열을 만듭니다. - 객체(
hash)를 사용해 이미 등장한 문자를 추적하고, 중복 객체 생성을 방지합니다. - 각 문자의 등장 횟수를
count속성에 누적합니다. - 마지막으로
sort()를 이용해 빈도수 내림차순으로 정렬하여 반환합니다.
예제 코드
const str = 'a b c d a v d e f g q';
const countFrequency = (str = '') => {
const result = [];
const hash = {};
const words = str.split(" ");
words.forEach(function (word) {
word = word.toLowerCase();
if (word !== "") {
if (!hash[word]) {
hash[word] = { name: word, count: 0 };
result.push(hash[word]);
}
hash[word].count++;
}
});
return result.sort((a, b) => b.count - a.count);
};
console.log(countFrequency(str));코드 설명
word.toLowerCase()를 호출하면 대소문자가 섞여 있어도 동일한 문자로 취급되어 정확한 빈도 계산이 가능합니다. 또한 hash 객체 덕분에 새로운 문자가 처음 등장할 때만 객체를 생성하고, 이후에는 기존 객체의 count만 증가시키므로 시간 복잡도 면에서도 효율적입니다. 빈 문자열 체크(word !== "")는 연속된 공백이 있을 때 발생할 수 있는 오류를 방지합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[
{ name: 'a', count: 2 },
{ name: 'd', count: 2 },
{ name: 'b', count: 1 },
{ name: 'c', count: 1 },
{ name: 'v', count: 1 },
{ name: 'e', count: 1 },
{ name: 'f', count: 1 },
{ name: 'g', count: 1 },
{ name: 'q', count: 1 }
]결과를 보면 'a'와 'd'가 각각 2번 등장하여 상위에 배치되고, 나머지 문자들은 1번씩 등장했음을 확인할 수 있습니다. 이처럼 해시 객체와 배열 정렬을 조합하면 공백으로 구분된 임의의 문자열에서 손쉽게 빈도수 통계를 얻을 수 있습니다.