알고리즘/프로그래머스
[프로그래머스] 뉴스 클러스터링 (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;
}