오늘의 알고리즘

[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;
}

카카오는 유난히 글을 힘들게 쓰는 경향이 있다...

글을 해석해도 문제를 풀 수가 있어야지 원...

처음에 정신 나갈 뻔했지만 어떻게든 풀어냈다...