문자열이 주어졌을 때, 각 문자가 몇 번 등장했는지 그 빈도수를 반환하는 함수를 작성해야 한다고 가정해 보겠습니다. 이때 중요한 조건은 문자의 대소문자를 구분하지 않는다는 점입니다.
즉, 'A'와 'a'는 서로 다른 문자가 아니라 동일한 문자로 취급되어야 하며, 두 경우 모두 하나의 키에 합산되어 집계되어야 합니다.
접근 방법
이 문제를 해결하는 가장 효율적인 방법은 다음과 같습니다.
- 문자열 전체를
toLowerCase()메서드로 소문자화하여 대소문자 차이를 제거합니다. - 문자열을 한 글자씩 순회하면서 객체에 문자를 키(key)로, 등장 횟수를 값(value)으로 저장합니다.
- 객체에 이미 존재하는 키라면 해당 값을 1씩 증가시킵니다.
코드 예제
위 로직을 구현한 코드는 다음과 같습니다.
const string = 'ASASSSASAsaasaBBBASvcdNNSASASxxzccxcv';
const countFrequency = str => {
const frequency = {};
// 소문자로 변환하여 대소문자를 구분하지 않음
for(char of str.toLowerCase()){
if(!frequency[char]){
frequency[char] = 1; // 처음 등장한 문자
}else{
frequency[char]++; // 이미 등장한 문자
};
};
return frequency;
};
console.log(countFrequency(string));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
{ a: 10, s: 11, b: 3, v: 2, c: 4, d: 1, n: 2, x: 3, z: 1 }결과 분석
출력된 객체를 보면 원본 문자열에는 대문자와 소문자가 섞여 있었지만, 모든 문자가 소문자 키로 통합된 것을 확인할 수 있습니다. 예를 들어 'A'와 'a'가 모두 키 'a'에 합산되어 총 10번으로 집계되었습니다.
이 방식은 문자열을 한 번만 순회하면 되므로 시간 복잡도가 O(n)으로, 문자열의 길이에 비례해 선형적으로 처리됩니다. 따라서 긴 문자열에서도 효율적으로 동작하며, 문자 빈도 분석이나 아나그램 판별 등 다양한 문제에 응용할 수 있습니다.