[ 프로그래머스 ] #17677 : [1차] 뉴스 클러스터링 - JAVA

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

import java.util.*;
class Solution {
    public int solution(String str1, String str2) {

        String []arr1=toArr(str1);
        String []arr2=toArr(str2);
        int sum= 0;//합집합 개수
        int cross=0;//교집합 개수
        double answer=0;
        Map<String,Integer>map1=new HashMap<>();
        Map<String,Integer>map2=new HashMap<>();

        for(int i=0;i<arr1.length;i++){// arr1 집합
            String s1=arr1[i];            
            if(map1.containsKey(s1)){
                map1.put(s1,map1.get(s1)+1);
            }else{
                map1.put(s1,1);
            }
        }

        for(int i=0;i<arr2.length;i++){//arr1,arr2의 교집합
            String s2=arr2[i];
            if(map1.containsKey(s2)){
                if(map2.containsKey(s2)){
                    map2.put(s2,map2.get(s2)+1);
                }else{
                    map2.put(s2,1);
                }
            }
        }

        for(String key: map2.keySet()){// 교집합 개수 계산
            int val1=map1.get(key);
            int val2=map2.get(key);
            cross+= Math.min(val1,val2);
        }

        // 합집합은 arr1, arr2 더 한 값에 교집합 빼주면 됨 
        sum+=arr2.length+arr1.length-cross;

        if(sum==0) answer=1;
        else answer = (double)cross/sum;

        return (int)Math.floor(answer*65536.0);
    }

    // 2문자로 배열 만듦
    private String[] toArr(String str){
        List<String>list=new ArrayList<>();
        int i=0;

        while(true){
            if(i==str.length()-1)break;

            char ch1=str.charAt(i);
            char ch2=str.charAt(i+1);

            if(Character.isAlphabetic(ch1) && Character.isAlphabetic(ch2)){
                list.add(
                     Character.toString(ch1).toLowerCase()
                    +Character.toString(ch2).toLowerCase());   
            }
            i++;
        }

        return list.toArray(new String[list.size()]);
    }
}