|
샘플을 만들어 봅니다.
전산을 전공하지도 않았고 알고리즘같은 것을 공부해 본적도 없기에
누가보면 소스가 허접할지도 모르겠네요
[샘플1]
1. TStringList 에 DelimitedText 기능을 이용하여
전체 문자열에서 space를 기준으로 짜릅니다.
2. 전체 N개 문자열중에서 n번째 문자열이 중복되는지 확인하기 위해서는
0번째 부터 n-1번째 까지 체크해서 문제 없으면 넘어가고
0~ n-1 번째까지 중에 n번째랑 같은것이 있으면 n번째 string을 delete합니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
String sStr=Edit1->Text;
//String sStr="문자열1 문자열2 ans 문자열1 문자열3 문자열2 문자열2 ";
TStringList *sLst=new TStringList;
sLst->Delimiter=' ';
sLst->DelimitedText=sStr;
int idx=0;
int i=0;
while(idx<sLst->Count)
{
for(i=0;i<idx;i++)
{
if(sLst->Strings[i]==sLst->Strings[idx])
{
sLst->Delete(idx);
break;
}
}
if(i>=idx)idx++;
}
Memo1->Lines->Assign(sLst);
delete sLst;
}
//---------------------------------------------------------------------------
[샘플2]
문자열을 하나씩 짜르면서 리스트에 담긴것과 같은것이 없으면
리스트에 추가합니다.
void __fastcall TForm1::Button4Click(TObject *Sender)
{
String sStr=Edit1->Text;
// String sStr="문자열1 문자열2 ans 문자열1 문자열3 문자열2 문자열2 ";
char *cSTmp,*cPTmp;
cSTmp=sStr.c_str();
TStringList *sLst=new TStringList;
String sTmp;
while(true)
{
cPTmp=AnsiStrPos(cSTmp," ");
if(cPTmp)
{
sTmp.SetLength(cPTmp-cSTmp);
strncpy(sTmp.c_str(),cSTmp,cPTmp-cSTmp);
int i=0;
for(;i<sLst->Count;i++)
if(sTmp==sLst->Strings[i])break;
sTmp=sTmp.Trim();
if(i>=sLst->Count&&sTmp.Length()>0)sLst->Add(sTmp);
cSTmp=cPTmp+1;
}
else
{
break;
}
}
Memo1->Lines->Assign(sLst);
delete sLst;
}
//---------------------------------------------------------------------------
[샘플3] - 추가한것
; 샘플1에서처럼 문자열을 짜르기에 TStringList 를 이용할뿐 아니라
중복된것 찾는것 또한 TStringList 에 IndexOf 기능을 이용하여 구현하였다.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
String sStr=Edit1->Text; //String sStr="문자열1 문자열2 ans 문자열1 문자열3 문자열2 문자열2 ";
TStringList *sLst=new TStringList;
TStringList *sPasLst=new TStringList;
sLst->Delimiter=' ';
sLst->DelimitedText=sStr;
for(int i=0;i<sLst->Count;i++)
{
if(sPasLst->IndexOf(sLst->Strings[i])<0)
sPasLst->Add(sLst->Strings[i]);
}
Memo1->Lines->Assign(sPasLst);
delete sLst;
delete sPasLst;
}
//---------------------------------------------------------------------------
Delphi나 C++Builder로 한다면 .. 샘플3이 개중 좋을듯 싶네요
더 좋은 알고리즘도 많을것 입니다.
그럼..
이용태 님이 쓰신 글 :
: 제가 예를 잘못 들었나 봅니다.
:
: 문자 배열이 아니고요... 문자열 배열입니다.
:
:
: 문자열1 = "우리나라"
: 문자열2 = "대한민국"
: 문자열3 = "단일민족"
:
: ------- ------- ------- ------- ------- -------
: 문자열1 문자열2 문자열1 문자열3 문자열2 문자열2
: ------- ------- ------- ------- ------- -------
:
: 이것을 중복된 값을 제외하여 다음과 같이 만들고 싶습니다.
:
: ------- ------- -------
: 문자열1 문자열2 문자열3
: ------- ------- -------
:
: 방법 아시는 분 알려주십시요...
:
:
: 김상면 님이 쓰신 글 :
: : 아주 기초적인 질문이라 대충 알고리즘만 적습니다.
: :
: : char src[9] = "aaabbacbc";
: : int dst[9] = {0,};
: : int i = 0;
: :
: : while (i<10)
: : dst[src[i++] - 'a']++;
: :
: : i = 0;
: : while (i < 10)
: : { if (dst[i])
: : cout << char(i + 'a');
: : i++;
: : }
: :
: : 실행 파일을 만들려면 좀 손을 봐야 하지만 알고리즘을 이해하는데는 문제가 없으리라 생각합니다.
: : 그럼
: :
: :
: : 이용태 님이 쓰신 글 :
: : : 다음과 같은 배열이 있습니다.
: : :
: : : char a[9];
: : : --- --- --- --- --- --- --- --- ---
: : : a a a b b a c b c
: : : --- --- --- --- --- --- --- --- ---
: : :
: : : 이 배열에서 중복된 값을 제외한 새로운 배열을 만들고 싶습니다.
: : :
: : : 즉.. 요렇게 말이죠..
: : : --- --- ---
: : : a b c
: : : --- --- ---
: : :
: : : 머리를 계속 굴려보는데... 퍼뜩이는 아이디어가 떠오르지 않습니다...;;;
: : :
: : : 아시는 분... 답변 부탁드립니다...
|