Study/Coding Test

[2018 1차 KAKAO] 뉴스 클러스터링

_gayeon 2021. 10. 10. 14:53

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

 

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

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

programmers.co.kr

 

벡터의 집합 연산 (합집합, 교집합)이 필요했던 문제.

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

using namespace std;

bool isAlphabet(char c){
    return (c>='a' && c<='z') || (c>='A' && c<='Z');
}

int solution(string str1, string str2) {
    vector<string> str1_vec;
    vector<string> str2_vec;

    for(int i=0; i<str1.size()-1; i++){
        string temp = "";
        if(isAlphabet(str1[i]) && isAlphabet(str1[i+1])){
            temp += tolower(str1[i]);
            temp += tolower(str1[i+1]);
            str1_vec.push_back(temp);
        }
    }
    
    for(int i=0; i<str2.size()-1; i++){
        string temp = "";
        if(isAlphabet(str2[i]) && isAlphabet(str2[i+1])){
            temp += tolower(str2[i]);
            temp += tolower(str2[i+1]);
            str2_vec.push_back(temp);
        }
    }
    
    sort(str1_vec.begin(), str1_vec.end());
    sort(str2_vec.begin(), str2_vec.end());
    
    vector<string> union_vec(str1_vec.size() + str2_vec.size());
    auto iter = set_union(str1_vec.begin(), str1_vec.end(), str2_vec.begin(), str2_vec.end(), union_vec.begin());
    union_vec.resize(iter - union_vec.begin());

    
    vector<string> intersec_vec(str1_vec.size() + str2_vec.size());
    iter = set_intersection(str1_vec.begin(), str1_vec.end(), str2_vec.begin(), str2_vec.end(), intersec_vec.begin());
    intersec_vec.resize(iter - intersec_vec.begin());

    
    if(union_vec.size() == 0){
        return 65536;
    }
    return (double)intersec_vec.size() / (double)union_vec.size() * 65536;
}