오늘의 알고리즘
[C++]2018 KAKAO BLIND RECRUITMENT[1차] 뉴스 클러스터링
하늘하늘 .
2022. 2. 16. 18:30
#include <string>
#include <algorithm>
#include <unordered_map>
using namespace std;
int solution(string str1, string str2)
{
int answer = 0;
int iNumber = 65536;
int iFirstSize = str1.size();
int iSecondSize = str2.size();
// 두 string 모두 대문자로
for (int i = 0; i < iFirstSize; ++i)
{
str1[i] = toupper(str1[i]);
}
for (int i = 0; i < iSecondSize; ++i)
{
str2[i] = toupper(str2[i]);
}
// 같다면 아예 리턴
if (str1 == str2)
return iNumber;
iFirstSize = str1.size();
iSecondSize = str2.size();
unordered_map<string, int> unMap1 = {};
unordered_map<string, int> unMap2 = {};
// 두개씩 unordered_map 에다가 넣기
for (int i = 0; i < iFirstSize - 1; ++i)
{
string keyStr = str1.substr(i, 2);
// 공백, 특수문자라면 넣지 않는다.
if (str1[i] >= 65 && str1[i] <= 90 && str1[i+1] >= 65 && str1[i+1] <= 90)
++unMap1[keyStr];
}
for (int i = 0; i < iSecondSize - 1; ++i)
{
string keyStr = str2.substr(i, 2);
if (str2[i] >= 65 && str2[i] <= 90 && str2[i + 1] >= 65 && str2[i + 1] <= 90)
++unMap2[keyStr];
}
int iMaxSize = 0;
int iMinSize = 0;
// 제일 작은 크기는 두개의 맵 중 가장 적은 만큼(0 포함) 더해준다
for (auto& map1 : unMap1)
iMinSize += min(map1.second, unMap2[map1.first]);
// 맵 2를 합집합으로 만든다.
for (auto& map1 : unMap1)
unMap2[map1.first] = max(unMap2[map1.first], map1.second);
// 맵 2의 수를 Max로 만든다.
for (auto& map2 : unMap2)
iMaxSize += map2.second;
if (!iMinSize && !iMaxSize)
return iNumber;
else
return iNumber * iMinSize / iMaxSize;
}
카카오는 유난히 글을 힘들게 쓰는 경향이 있다...
글을 해석해도 문제를 풀 수가 있어야지 원...
처음에 정신 나갈 뻔했지만 어떻게든 풀어냈다...