문제

교집합과 합집합

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm> // sort, min
using namespace std;

bool cmp(pair<string, int> a, pair<string, int> b) {
	return a.first < b.first;
}

vector< pair < string, int> > createSubstr(string str) {
	unordered_map<string, int> umap;
	int i, size = str.size();
	string tmp = "";

	for (i = 0; i < size - 1; i++) {
		tmp = "";

		// 기타 공백이나 숫자, 특수 문자가 들어있는 경우
		if (!(('a' <= str[i] && str[i] <= 'z') || ('A' <= str[i] && str[i] <= 'Z'))) continue;
		if (!(('a' <= str[i + 1] && str[i + 1] <= 'z') || ('A' <= str[i + 1] && str[i + 1] <= 'Z'))) continue;

		// 대소문자 무시: 대문자 -> 소문자
		if ('A' <= str[i] && str[i] <= 'Z') str[i] = 'a' + (str[i] - 'A');
		if ('A' <= str[i + 1] && str[i + 1] <= 'Z') str[i + 1] = 'a' + (str[i + 1] - 'A');

		tmp += str[i];
		tmp += str[i + 1];
		umap[tmp]++;
	}

	vector< pair < string, int> > v(umap.begin(), umap.end());
	sort(v.begin(), v.end(), cmp);

	return v;
}

int solution(string str1, string str2) {
	int answer = 0;
	int i, j, intersection, sum;

	// 부분 문자열 벡터 만들기
	vector< pair < string, int> > v1 = createSubstr(str1);
	vector< pair < string, int> > v2 = createSubstr(str2);

	// 교집합 구하기
	i = 0; j = 0; intersection = 0;
	while (i < v1.size() && j < v2.size()) {
		if (v1[i].first == v2[j].first) {
			intersection += min(v1[i].second, v2[j].second);
			i++;
			j++;
		}
		else if (v1[i].first < v2[j].first) i++;
		else  j++;
	}

	// 합집합 구하기
	sum = 0;
	for (i = 0; i < v1.size(); i++) sum += v1[i].second;
	for (i = 0; i < v2.size(); i++) sum += v2[i].second;
	sum -= intersection;
	if (sum == 0) return 65536;
	else return (int)((intersection * 65536) / sum);
}