Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 문자열 내 문자 빈도수 구하는 프로그램 완벽 정리

문자열(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')과 함께 활용하면 됩니다. 이러한 기법은 문자열 분석, 텍스트 처리, 간단한 통계 계산 등 다양한 프로그래밍 문제의 기초가 되므로 꼭 익혀두시기 바랍니다.