개발자 김수진

[프로그래머스] 뉴스 클러스터링 (C++) 본문

알고리즘/프로그래머스

[프로그래머스] 뉴스 클러스터링 (C++)

김수진장 2022. 9. 6. 00:04

[문제]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[풀이]

 

input string에 대해 두 글자씩 끊어서 다중 집합을 만들고 두 집합 간의 교집합/합집합 * 65536을 구해서 return 해주면 되는 문제

 

첫 번째로 각 input string에 대해 모두 lower case로 변환해주었다.

다음으로 연속된 두 글자가 알파벳인 경우 vector에 push 해주었다.

 

이중 for문을 통해 교집합을 구하고 교집합의 중복을 막기 위해 한번 확인한 글자는 #로 변환해주었다.

 

[코드]

 

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

bool isChar(char ch){
    if(ch>='a' && ch<='z')  return true;
    if(ch>='A' && ch<='Z')  return true;
    return false;
}

int solution(string str1, string str2) {
    int answer = 0;
    string tmp1="";
    string tmp2="";
    
    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]);
    }
    
    vector<string> p1;
    vector<string> p2;
    for(int i=0;i<str1.size()-1;i++){
        if(isChar(str1[i]) && isChar(str1[i+1]))
            p1.push_back(str1.substr(i,2));
    }    
    for(int i=0;i<str2.size()-1;i++){
        if(isChar(str2[i]) && isChar(str2[i+1]))
            p2.push_back(str2.substr(i,2));
    }
    
    int intersection=0; //교집합
    int _union= p1.size()+ p2.size(); //합집합
    
    for(int i=0;i<p1.size();i++){
        for(int j=0;j<p2.size();j++){
            if(p1[i]==p2[j]){
                intersection++;
                p2[j]="#";
                break;
            } 
        }
    }
    _union-=intersection;
    if(_union == 0)    return 65536;
    answer = intersection * 65536 /_union;
    return answer;
}