문자열(string)은 널(null) 문자('\0')로 끝나는 1차원 문자 배열입니다. 문자열에서 문자의 빈도(frequency)란 해당 문자가 문자열 안에 몇 번 등장하는지를 나타내는 횟수를 의미합니다.
빈도 개념 이해하기
예를 들어 다음과 같은 문자열이 있다고 가정해 보겠습니다.
String: Football is a sport 알파벳 'o'의 빈도: 3
위 문자열에서 알파벳 'o'는 총 3번 등장하므로 빈도는 3이 됩니다. 이제 C++을 이용해 특정 알파벳의 빈도를 구하는 방법부터, 문자열에 포함된 모든 알파벳의 빈도를 한 번에 구하는 방법까지 단계별로 살펴보겠습니다.
1. 특정 알파벳의 빈도 찾기
다음은 주어진 문자열에서 특정 알파벳(예제에서는 'a')이 몇 번 등장하는지 계산하는 프로그램입니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
char str[100] = "this string contains many alphabets";
char c = 'a';
int count = 0;
for(int i = 0; str[i] != '\0'; i++) {
if(str[i] == c)
count++;
}
cout<<"Frequency of alphabet "<<c<<" in the string is "<<count;
return 0;
}실행 결과
Frequency of alphabet a in the string is 4
코드 설명
위 프로그램에서는 for 루프를 사용해 문자열을 처음부터 끝까지 순회하며 알파벳 'a'의 빈도를 계산합니다. 루프 조건 str[i] != '\0'은 널 문자를 만날 때까지 반복한다는 의미로, 문자열의 끝을 판단하는 기준이 됩니다. 루프 내부에서 현재 문자 str[i]가 찾고자 하는 알파벳과 일치하면 count 변수를 1씩 증가시킵니다. 반복이 종료되면 최종적으로 누적된 count 값이 해당 알파벳의 빈도가 됩니다.
핵심 로직은 다음 코드 스니펫과 같습니다.
for(int i = 0; str[i] != '\0'; i++) {
if(str[i] == c)
count++;
}
cout<<"Frequency of alphabet "<<c<<" in the string is "<<count;2. 문자열 내 모든 알파벳의 빈도 찾기
특정 문자 하나만이 아니라, 문자열에 포함된 알파벳 a부터 z까지 전체의 빈도를 한꺼번에 구할 수도 있습니다. 이를 위해서는 크기 26의 정수 배열을 활용하는 것이 효율적입니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
char str[100] = "this string contains many alphabets";
int i = 0, alphabet[26] = {0}, j;
while (str[i] != '\0') {
if (str[i] >= 'a' && str[i] <= 'z') {
j = str[i] - 'a';
++alphabet[j];
}
++i;
}
cout<<"Frequency of all alphabets in the string is:"<<endl;
for (i = 0; i < 26; i++)
cout<< char(i + 'a')<<" : "<< alphabet[i]<< endl;
return 0;
}실행 결과
Frequency of all alphabets in the string is: a : 4 b : 1 c : 1 d : 0 e : 1 f : 0 g : 1 h : 2 i : 3 j : 0 k : 0 l : 1 m : 1 n : 4 o : 1 p : 1 q : 0 r : 1 s : 4 t : 4 u : 0 v : 0 w : 0 x : 0 y : 1 z : 0
코드 설명
위 프로그램에서는 while 루프를 사용해 문자열 전체를 검사하며 각 알파벳의 빈도를 계산합니다. 핵심 아이디어는 다음과 같습니다.
- 크기 26인 배열
alphabet[]이 각 알파벳(a~z)의 빈도를 저장합니다. - 변수
j는 알파벳을 인덱스 값으로 변환한 것으로, 'a'는 0, 'b'는 1처럼 대응됩니다. 이는str[i] - 'a'연산을 통해 얻을 수 있습니다. - 현재 문자가 소문자 알파벳 범위('a'~'z')에 속하면, 해당 인덱스의 배열 값을 1 증가시킵니다.
이 과정을 보여주는 핵심 코드 스니펫은 다음과 같습니다.
while (str[i] != '\0') {
if (str[i] >= 'a' && str[i] <= 'z') {
j = str[i] - 'a';
++alphabet[j];
}
++i;
}문자열 전체에 대한 검사가 끝나면, 마지막으로 for 루프를 사용해 배열에 저장된 각 알파벳의 빈도를 화면에 출력합니다. 이때 char(i + 'a') 연산을 통해 인덱스 값을 다시 알파벳 문자로 변환하여 함께 출력합니다.
cout<<"Frequency of all alphabets in the string is:"<<endl;
for (i = 0; i < 26; i++)
cout<< char(i + 'a')<<" : "<< alphabet[i]<< endl;마무리
이처럼 C++에서는 단순한 반복문과 배열만으로도 문자열 내 문자 빈도를 손쉽게 계산할 수 있습니다. 특정 문자 하나의 빈도를 구할 때는 카운터 변수 하나면 충분하고, 모든 알파벳의 빈도를 구할 때는 크기 26의 배열을 인덱스 매핑 기법(str[i] - 'a')과 함께 활용하면 됩니다. 이러한 기법은 문자열 분석, 텍스트 처리, 간단한 통계 계산 등 다양한 프로그래밍 문제의 기초가 되므로 꼭 익혀두시기 바랍니다.