[프로그래머스] [LV2] [1차] 뉴스 클러스터링

업데이트:

📚 [1차] 뉴스 클러스터링

링크📎 : https://programmers.co.kr/learn/challenges

난이도 ⭐️⭐️

📖 문제

이미지 이미지 이미지

📝 내 풀이

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        answer = (int)(65536 * Jaccard(splitString(str1.toUpperCase()), splitString(str2.toUpperCase())));
        return answer;
    }
    
    public double Jaccard(List<String> a, List<String> b){
        double d = 0.0;
        int dset = 0;
        int union = 0;
        
        if(a.size()==0 && b.size()==0) d = 1.0;
        else{
            for(String s : b){
                for(int i = 0; i < a.size(); i++){
                    if(a.get(i).equals(s)) {
                        a.remove(i);
                        dset++;
                        break;
                    }
                }
            }
            union = b.size() + a.size();
            d = (double)dset/union;
        }
        return d;
    }
    
    public List<String> splitString(String str){
        List<String> temp = new ArrayList<String>();
        
        for(int i = 0; i < str.length()-1; i++){
            if((str.charAt(i)>'Z'||str.charAt(i)<'A')||(str.charAt(i+1)>'Z'||str.charAt(i+1)<'A')) continue;
            temp.add(str.substring(i,i+2));
        }
        
        return temp;
    }
}

👊🏻 전략

  1. 두가지로 나눠서 풀자
  2. 다중 집합을 만드는 것
    • 영문자만
    • 대문자로만
  3. 자카드 유사도를 측정하자
    • 교집합은 중복이 가능함

끝-!

댓글남기기