1 분 소요

Question

Q Q2


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

Result

Result