c·c++/c++ 프로그래밍

확장된 애너그램 사전만들기

바로이순간 2013. 7. 24. 22:08

#include<iostream>

#include<fstream>

#include<string>

#include<cstring>

#include<algorithm>

#include<list>

#include<map>

#include<iterator>

#include<ctime>

using namespace std;


typedef multimap<string,string> multimap_1;

typedef multimap_1::value_type PS;

typedef multimap_1::const_iterator PSi;


typedef istream_iterator<string> string_input;

typedef ostream_iterator<string> string_output;

typedef string::const_iterator Str_iter;


typedef struct _TREE {

    int n;

    map<char,_TREE> child;

    list<string> words;

}TREE;


void Search(Str_iter wd,TREE *parents,string str,ofstream *result) {

    list<string>::const_iterator b;

    TREE *temp;

    temp = &(parents->child[*wd]);


    // 단어를 트리에 삽입할때 내려왔던 길이 아니면 리턴

    if(temp->n != 1)  { return; }


    if(!(temp->words.empty())) {

        for(b=temp->words.begin();b!=temp->words.end();++b) {

            string a = *b;

            a += '\n';

            result->write(a.c_str(),a.size());

        }

    }

    if(!(str.empty())) {

        string temp_string = str;

        char same= '~';


        for(wd = str.begin();wd != str.end();++wd) {

            temp_string = temp_string.erase(0,1);

            if(same != *wd) {

                Search(wd,temp,temp_string,result);

            } else { 

                same = same;

            }

            same = *wd;

        }

    }

}


int main() {

    ifstream ifs("words.txt");

    multimap_1 word_pairs;

    TREE tree,*cur_tree;

    time_t t;

    t = time(NULL);

    cout << ctime(&t) << endl;;

    cout << "파일을 읽고 있습니다"<< endl;

    //멀티맵으로 단어 복사

    for(string_input in(ifs);in != string_input(); ++in) {

        string word = *in;

        //  길이가 3 이하인것은 복사하지 않음.

        if(2 < in->size()) { 

            word = _strlwr(_strdup(word.c_str()));

            sort(word.begin(),word.end());

            word_pairs.insert(PS(word,*in));

        }

    }


    Str_iter str_iter;

    PSi j, k,s; // multimap_1 의 iterator 

    cout <<  "단어를 정렬합니다 " << endl;

    for(j = word_pairs.begin(); j != word_pairs.end();++j)  {

        cur_tree = &tree;

        //트리에 삽입

        for(str_iter=j->first.begin();str_iter != j->first.end();++str_iter) {

            cur_tree = &(cur_tree->child[*str_iter]);

            cur_tree->n = 1; // 자신이 내려갔던 길을 체크

        }

        cur_tree->words.insert(cur_tree->words.end(),j->second); 

        cur_tree = &tree;

    }



    // string st = "pestilential",st2; // 테스트용

    list<string> result;


    cout << "검색 & 출력합니다" << endl;

    cur_tree = &tree;

    char bn = '~';

    string st2;

    ofstream ofs("test.txt");

    for( s = word_pairs.begin(); s != word_pairs.end(); ++s) {

        st2= s->first;

        ofs << "단어: "<< s->second << endl;

        for(str_iter = s->first.begin();str_iter != s->first.end();++str_iter) {

            st2 = st2.erase(0,1);

            if( 2 > st2.size()) {  break; }

            if( bn != *str_iter) {

                Search(str_iter,cur_tree,st2,&ofs);

            }

            bn = *str_iter;

        }

        bn = '~';

    }

    ofs.close();


    t = time(NULL);

    cout << ctime(&t) << endl;

    return 0;

}


단어사전은 words.txt로 주어진다.

결과는 test.txt파일에 담겨진다.


##################################################################################

안녕하세요.


C로 게임을 만들려고하는데, 궁금증이 있어서 문의드립니다

text파일안에 수만개의 영단어들이 있는데,


제가 그중에 한 단어를 임의로 가져와서 ex) OHMYGOD

섞은후에 유저에게 보여주어야 합니다 ex ) DOGHOMY


그리고 저기위에 나와있는 단어를 기준으로 다시 text파일을 검색후에 저 단어로 만들수있는

단어들을 모두 보여줘야하는데, 예를 들어 DOG OH MY 라는 단어들이 하나씩 나뉘어져 있으면


각각의 단어들을 *** ** **이런 식으로 별표로 표기후에 유저가 정답을 맞추면 답을 보여주는 식으로

프로그램을 작성중인데, 문제점이 있습니다.


하나의 단어를 임의로 가져온후에 저 단어를 어떤식으로 이용해서 text파일안에 조합가능한 단어를

찾을수있는지 알고리즘을 부탁드리겠습니다.


수고하세요



======================================================================

위의 문제를 풀기 위해서는 단어사전이 반듯이 있어야 합니다.

이들 단어 사전을 words.txt파일에 넣어 놓고 다음 c++프로그램을 실행하면
각각의 단어에 대해서 이 단어의 주어진 알파벳의 전부 또는 일부를 사용해서
만들수 있는 단어(길이가 3이상인)들을 모두다 출력해 주는 프로그램입니다.

이 프로그램은 결과를 test.txt라는 파일에 출력을 해줍니다.
이 프로그램은 사전의 모든 표제어들에 대해서 이들 단어의 일부-일치 단어들을
모두 출력해 줍니다.

질문자의 경우에는 한 가지 단어 또는 문자만 입력해서 원래의 단어 사전에 등록되어 있는
단어들을 모두 추려내는 것이 가능합니다. 

이렇게 가능한 단어가 모두 주어지면 이들 단어들을 모아서 주어진 단어나 문자의 알파벳

구성과 같은 경우가 되는 것을 찾을 수 있을 것입니다.

'c·c++ > c++ 프로그래밍' 카테고리의 다른 글

2진수를 10진수로 바꾸기  (0) 2013.10.05
if문 없는 간단한 카드게임  (0) 2013.09.10
c++ 입력오류 해결  (0) 2013.05.31
복소수 클래스  (0) 2013.05.04
소인수 분해  (0) 2013.04.08