https://programmers.co.kr/learn/courses/30/lessons/17677

u_map 에 짝이 되는 string 과 그 개수를 저장.

중복되지 않게 v 에 string 을 저장

v 를 돌리면서 string 으로 map 에 접근해서 그 개수로 결과를 도출.

int solution(string str1, string str2) {
	std::transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
	std::transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
	std::unordered_map<string, int> str1Map;
	std::unordered_map<string, int> str2Map;
	std::vector<string> v;

	int answer = 0;
	int gyo = 0;
	int hab = 0;
	string subS;
	for (int i = 0; i < str1.size() - 1; i++) {
		if (isalpha(str1[i]) && isalpha(str1[i + 1])) {
			subS = str1.substr(i, 2);
			if (str1Map.find(subS) == str1Map.end()) {
				v.push_back(subS);
			}
			str1Map[subS]++;
		}
	}

	for (int i = 0; i < str2.size() - 1; i++) {
		if (isalpha(str2[i]) && isalpha(str2[i + 1])) {
			if (isalpha(str2[i]) && isalpha(str2[i + 1])) {
				subS = str2.substr(i, 2);
				if (str1Map.find(subS) == str1Map.end() && str2Map.find(subS) == str2Map.end()) {
					v.push_back(subS);
				}
				str2Map[subS]++;
			}
		}
	}
    if (v.size() == 0) return 65536;
	for (int i = 0; i < v.size(); i++) {
		if (str1Map.find(v[i]) != str1Map.end() && str2Map.find(v[i]) != str2Map.end()) {
			int min = std::min(str1Map[v[i]], str2Map[v[i]]);
			int max = std::max(str1Map[v[i]], str2Map[v[i]]);
			gyo += min;
			hab += max;
		}
		else if (str1Map.find(v[i]) != str1Map.end()) {
			hab += str1Map[v[i]];
		}
		else {
			hab += str2Map[v[i]];
		}
	}
	answer = (float)gyo / (float)hab * 65536;
	return answer;
}