뉴스 클러스터링

108번뇌·2021년 10월 1일
0

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;
}
profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글