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

C++ stringstream 활용법: 문자열 단어 개수와 빈도수 세기


stringstream 클래스란?

C++의 stringstream은 문자열 객체를 스트림과 연결해 주는 클래스입니다. 이 클래스를 사용하면 문자열을 마치 입출력 스트림처럼 다룰 수 있어, 공백을 기준으로 단어를 하나씩 추출하거나 데이터를 파싱하는 작업을 매우 간결하게 구현할 수 있습니다. 사용 시에는 <sstream> 헤더 파일을 포함해야 합니다.

예제에서 구현할 기능

아래 예제 코드는 stringstream을 활용해 두 가지 작업을 수행합니다.

  • 주어진 문자열에 포함된 총 단어 수 계산
  • map 컨테이너를 이용한 각 단어별 빈도수 집계

전체 소스 코드

#include <bits/stdc++.h>
using namespace std;

// 문자열의 총 단어 수를 반환하는 함수
int totalWords(string str) {
    stringstream s(str);
    string word;
    int count = 0;
    while (s >> word)
        count++;
    return count;
}

// 각 단어의 빈도수를 출력하는 함수
void countFrequency(string st) {
    map<string, int> FW;
    stringstream ss(st);
    string word;
    while (ss >> word)
        FW[word]++;
    map<string, int>::iterator m;
    for (m = FW.begin(); m != FW.end(); m++)
        cout << m->first << " = " << m->second << "\n";
}

int main() {
    string s = "Ajay Tutorial Plus, Ajay author";
    cout << "Total Number of Words=" << totalWords(s) << endl;
    countFrequency(s);
    return 0;
}

코드 상세 설명

1. totalWords() 함수

totalWords() 함수는 전달받은 문자열로 stringstream 객체를 생성한 뒤, s >> word 연산을 통해 공백을 기준으로 단어를 하나씩 추출합니다. 추출에 성공할 때마다 카운트가 증가하며, 더 이상 읽을 단어가 없으면 루프가 종료되고 최종 단어 수를 반환합니다.

2. countFrequency() 함수

countFrequency() 함수는 같은 방식으로 단어를 추출하면서 map<string, int> 컨테이너에 단어를 키(key)로 저장하고 등장 횟수를 값(value)으로 누적합니다(FW[word]++). 이후 반복자(iterator)로 map을 순회하며 각 단어와 빈도수를 출력합니다. map은 키를 자동으로 오름차순 정렬하므로 결과 역시 알파벳순으로 출력됩니다.

실행 결과

문자열 "Ajay Tutorial Plus, Ajay author"를 대상으로 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Total Number of Words=5
Ajay = 2
Tutorial = 1
Plus, = 1
author = 1

출력에서 확인할 수 있듯이 "Ajay"라는 단어는 두 번 등장했기 때문에 빈도수가 2로 표시되고, 나머지 단어들은 각각 1씩 집계됩니다. 참고로 쉼표가 붙은 "Plus,"는 하나의 단어로 처리되므로, 실무에서는 구두점 제거 같은 전처리 과정을 함께 추가하는 것이 좋습니다.