N

(프로그래머스 c++ KAKAO)뉴스 클러스터링 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)뉴스 클러스터링

naeunchan 2020. 6. 1. 11:16
728x90
반응형

먼저 str1과 str2를 두 글자씩 끊어서 각각 s1, s2 벡터에 넣어주도록 한다.

그러기 위해서는 str1과 str2을 모두 대문자나, 소문자로 바꿔주어야 한다.

그래서 transform() 함수를 이용하여 두 글자 모두 소문자로 바꿔주었다.

 

그리고 각각 for문을 이용하여 2글자씩 끊고, 두 글자 모두 알파벳인 경우 s1, s2에 넣어주었다.

만약 for문을 다 돈 후에 s1, s2가 모두 비어있으면 65536을 바로 리턴해준다.

아니라면 max변수에 s1.size() + s2.size()를 대입한다.

(max = 합집합, min = 교집합을 나타낸다..! 변수명 오류..ㅎㅎ)

 

s1, s2의 크기를 비교하여 교집합의 개수를 구하는 for문을 수행하고,

max -= min을 해주면 합집합의 개수가 나온다.

(합집합, 교집합 개수 구하는 공식 사용..!)

합집합의 개수가 0인 경우 나누었을 때 에러가 발생하므로 65536을 리턴하여 준다.

아니라면 min, max를 double형으로 변환 후 나누어주고, 마지막에 65536을 곱하여 리턴하면 끝..!

#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int solution(string str1, string str2) {
    int answer = 0, min = 0, max = 0;
    vector<string> s1, s2, words;
    
    transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
    transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
    
    for(int i = 0; i < str1.size() - 1; i++)
    {
        string tmp = str1.substr(i, 2);
        if(tmp[0] >= 'a' && tmp[0] <= 'z' && tmp[1] >= 'a' && tmp[1] <= 'z')
            s1.push_back(tmp);
    }
    
    for(int i = 0; i < str2.size() - 1; i++)
    {
        string tmp = str2.substr(i, 2);
        if(tmp[0] >= 'a' && tmp[0] <= 'z' && tmp[1] >= 'a' && tmp[1] <= 'z')
            s2.push_back(tmp);
    }
    
    if(s1.empty() && s2.empty())
        return 65536;
    
    max = s1.size() + s2.size();
    
    if(s1.size() > s2.size())
    {
        for(int i = 0; i < s2.size(); i++)
        {
            auto itr = find(s1.begin(), s1.end(), s2[i]);
            if(itr != s1.end())
            {
                min++;
                s1.erase(itr);
            }
        }
    }
    else
    {
        for(int i = 0; i < s1.size(); i++)
        {
            auto itr = find(s2.begin(), s2.end(), s1[i]);
            if(itr != s2.end())
            {
                min++;
                s2.erase(itr);
            }
        }
    }
    
    max -= min;
    
    if(max == 0)
        return 65536;
        
    double tmp = (double)min / (double)max;
    
    return tmp * 65536;
}
728x90
반응형