알고리즘/PS - 프로그래머스

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

excited-hyun 2021. 8. 2. 16:05
반응형

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

 

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

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

programmers.co.kr

 

풀이

 

set을 사용해야하나 있지만, 다중 집합이기 때문에 vector를 사용해 풀이하였습니다.

자세한 내용은 주석 참고!

 

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;


int solution(string str1, string str2) {
    int answer = 0;
    vector<string> s1;
    vector<string> s2;
    
    //대문자 변환
    transform(str1.begin(), str1.end(), str1.begin(), ::toupper);
    transform(str2.begin(), str2.end(), str2.begin(), ::toupper);
    
    //str1 처리
    for(int i=0; i<str1.length(); i++){
        // 알파벳이 아닌 경우
        if(str1[i] <65 || str1[i] > 90 || str1[i+1] <65 || str1[i+1] > 90)
            continue;
        string temp = "";
        temp += str1[i];
        temp += str1[i+1];
        s1.push_back(temp);
    }
    
    //str2 처리
    for(int i=0; i<str2.length(); i++){
        if(str2[i] <65 || str2[i] > 90 || str2[i+1] <65 || str2[i+1] > 90)
            continue;
        string temp = "";
        temp += str2[i];
        temp += str2[i+1];
        s2.push_back(temp);
    }
    
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    
    int sumS = s1.size() + s2.size();
    int interS=0;
    
    //교집합 크기 찾기
    for(int i=0; i<s1.size(); i++){
        auto it = find(s2.begin(), s2.end(), s1[i]);
        //겹치는거 찾은 경우
        if(it != s2.end()){
            interS++;
            s2.erase(it);
        }
    }
    
    //합집합 크기
    sumS-=interS;
    
    //둘다 공집합인 경우
    if(sumS == 0)
        answer = 1 * 65536;
    else{
        double result = ((double)interS / (double)sumS) * 65536;
        answer = (int)result;
    }
    
    return answer;
}
728x90
반응형