[Programmers] Level2 : [1차] 뉴스 클러스터링
Question
Solution
- str1의 다중 집합인 vector v1과 str2의 다중 집합인 vector v2를 선언한다.
- 각각의 다중 집합은 for 루프로 i와 i+1이 알파벳인 경우 string 타입으로 합쳐 vector에 넣는다.
- 교집합은 vector intersection을 선언하고 v1과 v2를 비교하며 같은 string 값이 있으면 비교 대상인 v2의 값을 공백으로 만든다.
- 합집합은 vector sumSet을 선언하고 v1과 교집합으로 인해 공백이 있는 v2의 합이 된다. (공백을 제외하고 합하면 된다.)
Cord
#include <string>
#include <vector>
using namespace std;
int solution(string str1, string str2)
{
int answer = 0;
vector<string> v1;
vector<string> v2;
vector<string> intersection; // 교집합
vector<string> sumSet; // 합집합
string temp = "";
// set1 다중 집합 원소 만들기 - 두자리씩 검사
for (int i = 0; i < str1.size()-1; ++i)
{
if (!isalpha(str1[i]) || !isalpha(str1[i + 1])) { continue; }
temp += toupper(str1[i]);
temp += toupper(str1[i + 1]);
v1.push_back(temp);
temp = "";
}
// set2 다중 집합 원소 만들기 - 두자리씩 검사
for (int i = 0; i < str2.size() - 1; ++i)
{
if (!isalpha(str2[i]) || !isalpha(str2[i + 1])) { continue; }
temp += toupper(str2[i]);
temp += toupper(str2[i + 1]);
v2.push_back(temp);
temp = "";
}
// 교집합 - v2에서 교집합을 찾으면 공백으로 만들기
for (int i = 0; i < v1.size(); ++i)
{
for (int j = 0; j < v2.size(); ++j)
{
if (v1[i] == v2[j])
{
intersection.push_back(v1[i]);
v2[j] = "";
break;
}
}
}
// 합집합 - v1 + v2(공백제외)
for (int i = 0; i < v1.size(); ++i)
{
sumSet.push_back(v1[i]);
}
for (int i = 0; i < v2.size(); ++i)
{
if (v2[i] == "") { continue; }
sumSet.push_back(v2[i]);
}
// 합집합이 없을 경우
if (sumSet.size() == 0) { return 65536; }
float round = (float)intersection.size() / sumSet.size();
answer = round * 65536;
return answer;
}