https://programmers.co.kr/learn/courses/30/lessons/17677
엄청나게 긴 풀이
교집합, 합집합 구할때
교집합 : 맵 각각 2개 만들어서, 두개의 맵에서 일치할 때, 벨류값중 작은거 선택한다.
합집합 : 맵 각각 2개 만들어서, 두개의 맵에서 일치할 때, 벨류값 중 큰거 선택한다 and 그 벨류값은 0으로 만들고, 나머지 벨류값들 전부 다 합친다.
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int solution(string str1, string str2) {
int answer = 0;
double Gyo(0);
double Hap(0);
vector<string> vTemp1;
vector<string> vTemp2;
for (int i = 0; i < str1.size() - 1; i++)
{
string sTemp = str1.substr(i, 2);//두개씩 짜른다.
for (int j = 0; j < 2; j++)
{
sTemp[j] = toupper(sTemp[j]);
}
if ((sTemp[0] >= 'A' && sTemp[0] <= 'Z') && (sTemp[1] >= 'A' && sTemp[1] <= 'Z'))//대문자 처리해서 A보다 크고 Z보다 작을때
{
vTemp1.push_back(sTemp);
}
}
for (int i = 0; i < str2.size() - 1; i++)
{
string sTemp = str2.substr(i, 2);//두개씩 짜른다.
for (int j = 0; j < 2; j++)
{
sTemp[j] = toupper(sTemp[j]);
}
if ((sTemp[0] >= 'A' && sTemp[0] <= 'Z') && (sTemp[1] >= 'A' && sTemp[1] <= 'Z'))//대문자 처리해서 A보다 크고 Z보다 작을때
{
vTemp2.push_back(sTemp);
}
}
if (vTemp1.size() == 0 && vTemp2.size() == 0) return 65536;
sort(vTemp1.begin(), vTemp1.end(), [](string a, string b) {
return a < b;
});//오름차순정렬
sort(vTemp2.begin(), vTemp2.end(), [](string a, string b) {
return a < b;
});//오름차순정렬
//교집합구하기
map<string, int> mTemp;
map<string, int> mVTemp1;
map<string, int> mVTemp2;
map<string, int>::iterator m_itr;
map<string, int>::iterator m_itr1;
for (int i = 0; i < vTemp1.size(); i++)
{
mVTemp1[vTemp1[i]]++;
}
for (int i = 0; i < vTemp2.size(); i++)
{
mVTemp2[vTemp2[i]]++;
}
for (m_itr = mVTemp1.begin(); m_itr != mVTemp1.end(); m_itr++)
{
for (m_itr1 = mVTemp2.begin(); m_itr1 != mVTemp2.end(); m_itr1++)
{
if (m_itr->first == m_itr1->first)
{
int iTemp = min(m_itr->second, m_itr1->second);
mTemp[m_itr->first] = iTemp;
}
}
}
for (m_itr = mTemp.begin(); m_itr != mTemp.end(); m_itr++)
{
Gyo += m_itr->second;
}
map<string, int> mV1;
map<string, int> mV2;
for (int i = 0; i < vTemp1.size(); i++)
{
mV1[vTemp1[i]]++;
}
for (int i = 0; i < vTemp2.size(); i++)
{
mV2[vTemp2[i]]++;
}
vector<string> vHap;//합침영역 넣기
for (m_itr = mV1.begin(); m_itr != mV1.end(); m_itr++)
{
for (m_itr1 = mV2.begin(); m_itr1 != mV2.end(); m_itr1++)
{
if (m_itr->first == m_itr1->first)
{
int iTemp = max(m_itr->second, m_itr1->second);
Hap += iTemp;
vHap.push_back(m_itr->first);
}
}
}
for (int i = 0; i < vHap.size(); i++)
{
for (m_itr = mV1.begin(); m_itr != mV1.end(); m_itr++)
{
if (vHap[i] == m_itr->first)
{
m_itr->second = 0;
}
}
}
for (m_itr = mV1.begin(); m_itr != mV1.end(); m_itr++)
{
Hap += m_itr->second;
}
for (int i = 0; i < vHap.size(); i++)
{
for (m_itr = mV2.begin(); m_itr != mV2.end(); m_itr++)
{
if (vHap[i] == m_itr->first)
{
m_itr->second=0;
}
}
}
for (m_itr = mV2.begin(); m_itr != mV2.end(); m_itr++)
{
Hap += m_itr->second;
}
answer = (Gyo / Hap) * 65536;
return answer;
}