
입력 형식
출력 형식
입력으로 들어온 두 문자열의 자카드 유사도를 출력한다. 유사도 값은 0에서 1 사이의 실수이므로, 이를 다루기 쉽도록 65536을 곱한 후에 소수점 아래를 버리고 정수부만 출력한다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string str1, string str2) {
double answer = 0 ;
int same=0,total =0 ,len1 = str1.length(), len2 = str2.length(),i ;
vector<string> vt;
//영어를 소문자로 변환
transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
for(i = 0 ; i < len1-1; i++){
if((str1[i]>='a' && str1[i]<='z') && (str1[i+1]>='a' && str1[i+1]<='z') ){// 순수 문자열이라면
string st = str1.substr(i,2);
vt.push_back(st);
}else{
continue;
}
}
answer = vt.size();
for(i = 0 ; i < len2-1; i++){
if((str2[i]>='a' && str2[i]<='z') && (str2[i+1]>='a' && str2[i+1]<='z') ){
string st = str2.substr(i,2);
total++;
if(find(vt.begin(),vt.end(),st) != vt.end() ){//동일한 것이 존재한다면
int a = find(vt.begin(),vt.end(),st) - vt.begin() ;
vt.erase(vt.begin()+ a );
same++; //교집합
}
}else{
continue;
}
}
//집합A와 B가 모두 공집합일 경우에는 자카드 유사도는 1로 정의
if (same == 0 && (answer+total-same == 0))return 65536;
answer = ( same * 65536 / (answer+total-same )) ;
return answer;
}
-> 몇 일 동안이나 테스트케이스 5,13번만 오답으로 나와서 헤맸는데 문제 설명에
" 집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의한다."
라고 나와있었다. . . 이 부분만 잘 읽었더라면 시간이 오래 걸리지 않았을 터인데..
문제를 꼼꼼히 , 설명도 꼼꼼히 읽자.

if (same == 0 && (answer+total == 0))return 65536;