Coding_Test_C++

Programmers Level 2: 뉴스 클러스터링(C++)

https://programmers.co.kr/learn/courses/30/lessons/17677

 

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

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

programmers.co.kr

풀이법

1) 문자열을 활용한 교집합 합집합 문제이다. 

2) char 값을 정제하여 string에 붙이기 위해서 string.push_back 함수를 사용할 수 있다는 것을 익힐 수 있었으며, 교집합 계산 시에 break 함수를 사용하지 않으면 정답을 얻을 수 없었다.

#include <string>
#include <vector>
#include <math.h>
using namespace std;
int gyo(vector<string> a, vector<string> b)
{
    vector<string> temp;
    vector<string> strFirst(a);
    vector<string> strSecond(b);
    for(int i=0; i<strFirst.size();i++)
    {
        for(int j=0; j<strSecond.size();j++)
        {
            if(strFirst[i]==strSecond[j])
            {
                if(strSecond[j]!="1")
                {
                    temp.push_back(strFirst[i]);
                    strSecond[j]="1";
                    break;
                }
            }
        }
    }
    
    return temp.size();
}
int hap(vector<string> a, vector<string> b)
{
    vector<string> temp;
    vector<string> strFirst(a);
    vector<string> strSecond(b);
    for(int i=0; i<strFirst.size();i++)
    {
        for(int j=0; j<strSecond.size();j++)
        {
            if(strFirst[i]==strSecond[j])
            {
                if(strSecond[j]!="1")
                {
                    temp.push_back(strFirst[i]);
                    strSecond[j]="1";
                    break;
                }
            }
        }
    }
    int ans=strFirst.size();
    for(int i=0;i<strSecond.size();i++)
    {
        if(strSecond[i]!="1")
            ans++;
    }
    return ans;
}
int solution(string str1, string str2) {
    int answer = 0;
    vector<string> strFirst;
    vector<string> strSecond;
    if(str1.size()==0 && str2.size()==0)
        return 1;
    for(int i=0; i<str1.size()-1;i++)
    {
        char a=str1[i];
        char b=str1[i+1];
        if(a>='a'&&a<='z')
            a=a-32;
        if(a<'A'||a>'Z')
            continue;
        if(b>='a'&&b<='z')
            b=b-32;
        if(b<'A'||b>'Z')
            continue;
        string temp;
        temp.push_back(a);
        temp.push_back(b);
        strFirst.push_back(temp);
    }
    for(int i=0; i<str2.size()-1;i++)
    {
        char a=str2[i];
        char b=str2[i+1];
        if(a>='a'&&a<='z')
            a=a-32;
        if(a<'A'||a>'Z')
            continue;
        if(b>='a'&&b<='z')
            b=b-32;
        if(b<'A'||b>'Z')
            continue;
        string temp;
        temp.push_back(a);
        temp.push_back(b);
        strSecond.push_back(temp);
    }
    if (strFirst.size() == 0 && strSecond.size() == 0)
        return 1*65536;
    int same=gyo(strFirst,strSecond);
    int all=hap(strFirst,strSecond);
    answer=floor((same/(float)all)*65536);
    return answer;
}