본문 바로가기

c++/프로그래머스

프로그래머스 : [1차] 뉴스 클러스터링 c++

https://programmers.co.kr/learn/courses/30/lessons/17677?language=cpp# 

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

 

풀이는 나중에...

 

#include <string>
#include <iostream>
#include <vector>
using namespace std;

vector<pair<string,int>> v1,v2;


int solution(string str1, string str2) {
    int answer = 0;
    
    //일단 만약 대문자면 다 소문자로 바꾸고 시작하자
    for(int i=0;i<str1.size();i++)
    {
        str1[i] = tolower(str1[i]);
    }
    for(int i=0;i<str2.size();i++)
    {
        str2[i] = tolower(str2[i]);
    }
    
    //이제 음절별로 나누기, 중복인게 있으면 갯수를 cnt하면됩니다
    //1번
    for(int i=0;i<str1.size()-1;i++)
    {
        char tmp1 = str1[i];
        char tmp2 = str1[i+1];
        //만약 둘중 하나가 알파벳 아니면 그 쌍을 버려버립니다.
        if((tmp1<'a')||(tmp1>'z'))
        {
            continue;
        }
         if((tmp2<'a')||(tmp2>'z'))
        {
            continue;
        }
        //여기까지 왔으면 알파벡으로만 이루어진 쌍임
        string tmp;
        bool tmpp = false;
        tmp.push_back(tmp1);
        tmp.push_back(tmp2);
        for(int k=0;k<v1.size();k++)
        {
            if(v1[k].first == tmp)
            {
                v1[k].second++;
                tmpp = true;
                break;
            }
        }
        if(tmpp == true)
            continue;
        v1.push_back(make_pair(tmp,1));
    }
    //이제 음절별로 나누기, 중복인게 있으면 갯수를 cnt하면됩니다
    //2번
    for(int i=0;i<str2.size()-1;i++)
    {
        char tmp1 = str2[i];
        char tmp2 = str2[i+1];
        //만약 둘중 하나가 알파벳 아니면 그 쌍을 버려버립니다.
        if((tmp1<'a')||(tmp1>'z'))
        {
            continue;
        }
         if((tmp2<'a')||(tmp2>'z'))
        {
            continue;
        }
        //여기까지 왔으면 알파벡으로만 이루어진 쌍임
        string tmp;
        bool tmpp = false;
        tmp.push_back(tmp1);
        tmp.push_back(tmp2);
        for(int k=0;k<v2.size();k++)
        {
            if(v2[k].first == tmp)
            {
                v2[k].second++;
                tmpp = true;
                break;
            }
        }
        if(tmpp == true)
            continue;
        v2.push_back(make_pair(tmp,1));
    }
    //세팅은 다 끝났습니다
    
    //둘다 공집합이면 0
    if((v1.size() == 0) && (v2.size() == 0))
        return 65536;
    
    int both=0;
    int all =0;
    int v2_size = v2.size();
    vector<int> visited(v2_size,0);
    for(int i=0;i<v1.size();i++)
    {
        //일단 겹치는게 있으면, 그중 작은놈을 both에 더하고 큰놈을 all에 더해
        // 안겹친다? all++ 하고 스킵
        bool flag =false;
        for(int j=0;j<v2.size();j++)
        {
            if(v1[i].first == v2[j].first)
            {
                both += min(v1[i].second,v2[j].second);
                all += max(v1[i].second,v2[j].second);
                visited[j] = 1;
                flag = true;
            }
        }
        if(flag == false)
            all += v1[i].second;
    }
    for(int i=0;i<v2.size();i++)
    {
        if(visited[i] == 0)
            all += v2[i].second;
    }
    answer = (65536*both)/all;
    return answer;
}