E-mail 분석기

이메일 리스트가 있을 때 정렬 할 수 있고 서비스 제공별로 통계를 낼 수 있다. 모 회사에서 단체 메일을 보낼때 실수로 숨은 참조를 하지 않고 보내 수백개의 E-mail 주소를 확보 하였는데 그 데이터로 이쪽 분야에 몸을 담고 있는 사람들이 사용하는 E-mail서비스 업체의 순위를 구하고 싶어 졌다.
 

돌려본 결과

Total : 549

naver.com : 274
nate.com : 78
hanmail.net : 63
gmail.com : 48
hotmail.com : 37
paran.com : 6
daum.net : 5
lycos.co.kr : 4
korea.ac.kr : 4
cyworld.com : 3
empal.com : 3
snu.ac.kr : 2
netsgo.com : 2
kw.ac.kr : 2
hanafos.com : 2
konkuk.ac.kr : 1
lawliet.biz : 1
kaist.ac.kr : 1
msn.com : 1
nait.com : 1
hufs.ac.kr : 1
hanyang.ac.kr : 1
naver.om : 1
hanmai.net : 1
postech.ac.kr : 1
pusan.ac.kr : 1
hamail.net : 1
sogang.ac.kr : 1
talsu.net : 1

메일 주소를 잘못적은 분들 몇분 있었고 nate메일이 저렇게 많이 사용 될 줄은 몰랐다.. gmail은 생각 보다 많이 사용 하고 있다.
학교 메일 쓰는 분도 많이 계시고..

#include 
#include 
#include 
#include 
#include 

struct Email {
	std::string id;
	std::string service;

	std::string toString() {
		return id + "@" + service;
	}
};

struct EmailPair {
	std::string service;
	int number;
};

class CompareByService {
public:
	bool operator()(const Email& lhs, const Email& rhs) {
		return lhs.service < rhs.service;
	}
};

class CompareByNumber {
public:
	bool operator()(const EmailPair& lhs, const EmailPair& rhs) {
		return lhs.number > rhs.number;
	}
};
class EmailList {
	std::vector mails;
public:
	void input(std::string str) {

		std::stringstream ss(str);
		std::string mailStr;
		ss >> mailStr;
		unsigned int index = 0;
		bool find = false;
		for (; index < mailStr.size(); ++index) {
			if (mailStr[index] == '@') {
				find = true;
				break;
			}
		}
		if (find) {
			Email mail;
			mail.id = mailStr.substr(0, index);
			index++;
			mail.service = mailStr.substr(index, mailStr.size() - index);
			std::transform(mail.service.begin(), mail.service.end(),
					mail.service.begin(), tolower);
			mails.push_back(mail);
		}
	}

	void printList() {
		for (std::vector::iterator it = mails.begin(); it != mails.end(); ++it) {
			std::cout << (*it).toString() << std::endl;
		}
	}

	void sortByService() {
		std::sort(mails.begin(), mails.end(), CompareByService());
	}

	void analysis() {
		std::cout << "Total : " << mails.size() << std::endl;
		sortByService();
		std::string mail = (*(mails.begin())).service;
		std::vector services;
		std::vector numbers;
		std::vector data;
		int count = 1;

		for (std::vector::iterator it = mails.begin(); it != mails.end(); ++it) {

			if (mail == (*it).service) {
				++count;
			} else {
				EmailPair serviceData;
				serviceData.number = count;
				serviceData.service = mail;
				data.push_back(serviceData);
				mail = (*it).service;
				count = 1;
			}

		}

		std::sort(data.begin(), data.end(), CompareByNumber());

		for (std::vector::iterator it = data.begin(); it
				!= data.end(); ++it) {
			std::cout << (*it).service << " : " << (*it).number << std::endl;
		}
	}

};

int main() {

	std::string buffer;
	EmailList emailList;
	while (true) {
		std::getline(std::cin, buffer);
		if (buffer.empty())
			break;
		emailList.input(buffer);
	}
	emailList.analysis();

	return 0;
}

실수도 할수 있는거지 뭐.. 그래도 덕분에 잠깐이나마 재미 있는 시간을 보냈다!

답글 남기기

이메일 주소는 공개되지 않습니다.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.