[Programmers] 뉴스 클러스터링

김토리·2024년 10월 6일

알고리즘

목록 보기
21/27

입력 형식

  • 입력으로는 str1과 str2의 두 문자열이 들어온다. 각 문자열의 길이는 2 이상, 1,000 이하이다.
  • 입력으로 들어온 문자열은 두 글자씩 끊어서 다중집합의 원소로 만든다. 이때 영문자로 된 글자 쌍만 유효하고, 기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다. 예를 들어 "ab+"가 입력으로 들어오면, "ab"만 다중집합의 원소로 삼고, "b+"는 버린다.
  • 다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. "AB"와 "Ab", "ab"는 같은 원소로 취급한다.

출력 형식

입력으로 들어온 두 문자열의 자카드 유사도를 출력한다. 유사도 값은 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;
profile
웹 개발하며 데이터 분석, AI 공부하는 jinveloper

0개의 댓글