코딩 공부 - 프로그래머스 - [1차] 뉴스 클러스터링
문제
설명
- 두 문자열의 문자열 내부에 크기가 2인 부분문자열 집합의 자카드 유사도를 구하는 문제
- 자카드 유사도는 두 집합의 교집합의 크기를 두 집합의 합집합의 크기로 나눈 값이다.
코드
#include <string>
#include <algorithm>
#include <cctype>
#include <set>
using namespace std;
int solution(string str1, string str2) {
int answer = 0;
multiset<string> s;
multiset<string> s2;
int u = 0, n = 0;
// 모든 알파벳을 소문자로 변경
std::transform(str1.begin(), str1.end(), str1.begin(),
[](unsigned char c){ return std::tolower(c); });
std::transform(str2.begin(), str2.end(), str2.begin(),
[](unsigned char c){ return std::tolower(c); });
// 각각의 집합에 문자쌍 추가, 집합의 전체 크기 계산
for (int i = 0; i < str1.size() - 1; i++) {
if (str1[i] >= 'a' && str1[i] <= 'z'
&& str1[i+1] >= 'a' && str1[i+1] <= 'z') {
s.insert(str1.substr(i,2));
u++;
}
}
for (int i = 0; i < str2.size() - 1; i++) {
if (str2[i] >= 'a' && str2[i] <= 'z'
&& str2[i+1] >= 'a' && str2[i+1] <= 'z') {
s2.insert(str2.substr(i,2));
u++;
}
}
// 교집합 제거
for (auto tmp : s2) {
auto it = s.find(tmp);
if (it != s.end()) {
n++;
u--;
s.erase(it);
}
}
double d;
if (u != n) {
d = (double)n / u;
} else {
d = 1;
}
d *= 65536;
answer = d;
return answer;
}
공유하기
Twitter Facebook LinkedIn댓글을 남기시려면 Github 로그인을 해주세요