본문 바로가기

C++ Programming/Accelerated C++

알파벳 빈도수 알고리즘


#include <iostream>
#include <string>
#define MAX_STRING 512
using std::cout; using std::cin;
using std::string;

void CharFrequency(string context, string &result);

int _tmain(int argc, _TCHAR* argv[])
{
 string context, result ;

 cout << "Please enter the context: ";
                           //cin.getline(cin,char *타입변수);
 getline(cin,context,'\n');                          //getline(cin,context,'\n');
                           //cin자체는 공백구분, 엔터구분이다.
  CharFrequency(context,result); //빈도수를 계산, 결과를 result변수에 담는다.
 
  cout << result;
 return 0;
}

/**********************************************
CharFrequency : 문자열에서 문자빈도수체크함수
input  : string , string &
output : 레퍼런스로 들어온 두번째 인자에 저장된다. 
ex) string context = "deefsddq"-> string result : "d3e2f1s1q1"
***********************************************/

void CharFrequency(string context, string &result)
{
 char character[MAX_STRING]; //찾은 문자 저장 배열
 int num[MAX_STRING]; //찾은 문자 갯수 저장 배열
  const char *c_context = context.c_str(); //string에서 cstring 배열타입으로 변환
  int count=0, erase_count = 0, length = context.length(); //count -> 찾은 문자 갯수(중복제외), erase_count-> 지운 문자 갯수
  while(erase_count < length) //지운 문자 갯수보다 문장의 길이보다 작을때까지
  {  
   character[count] = c_context[0]; //처음문자를 받아온다.
      num[count] = 0; //처음문자갯수를 0으로 초기화
   string::size_type begin = 0 , end = context.size(); //context값의 begin값과 end값 설정
   while(begin < end)  //begin값부터 end값까지 반복한다.
   {
    string::size_type index = context.find(character[count],begin); //token을 context에서 찾아서 해당인덱스반환
    if(index == string::npos) //검색함수가 실패했을때 string::npos를 반환한다.
     break;  //더이상없다.
     num[count]++;  //찾은 문자갯수 플러스
    context.erase(index,1); //찾은 문자를 string문장에서 제거한다.
    erase_count++;  //지운문자를 플러스
   }
   count++;
  }

  string::iterator pos = result.begin();
  char r_num[50] = {NULL,};
  for(int n=count-1;n>=0;n--) //뒤에서부터
  {
   itoa(num[n],r_num,10); //문자로 변환
   for(int r=49 ; r>=0 ; r--)
   {
    if(r_num[r] != NULL)
     pos = result.insert(pos,r_num[r]); //갯수 추가
   }
      pos = result.insert(pos,character[n]); // 문자 추가
  }
}