본문 바로가기
알고리즘

[프로그래머스] 뉴스 클러스터링 - java

by minkang 2021. 9. 23.

https://programmers.co.kr/learn/courses/30/lessons/17677

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

import java.util.*;
class Solution {
    public int solution(String str1, String str2) {
        int answer = J(str1.toUpperCase(), str2.toUpperCase());
        return answer;
    }
    
    int J(String str1, String str2) {
        Map<String, Integer> hm1 = new HashMap<>();
        Map<String, Integer> hm2= new HashMap<>();
        int intersection = 0;
        int sum = 0;
        
        initHashMap(hm1, str1);
        initHashMap(hm2, str2);
        
        for(String key : hm1.keySet()){
            if(hm2.containsKey(key)){
                intersection += Math.min(hm1.get(key), hm2.get(key));
            }
            sum += hm1.get(key);
        }
        
        for(String key : hm2.keySet()){
            sum += hm2.get(key);
        }
        sum -= intersection;        
        
        if(sum == 0){
            return 65536;
        }
        return intersection*65536/sum;
    }
    
    void initHashMap(Map<String, Integer> hm, String str){
        for(int i=0; i<str.length()-1; i++){
            if(!(isAlphabet(str.charAt(i)) && isAlphabet(str.charAt(i+1)))){
                continue;
            }
            String s = str.charAt(i) + "" + str.charAt(i+1);
            if(!hm.containsKey(s)){
                hm.put(s, 1);
                continue;
            }
            hm.put(s, hm.get(s)+1);
        }
    }
               
    boolean isAlphabet(char c) {
        if(c >= 'A' && c<= 'Z'){
            return true;
        }
        return false;
    }
}

str1                                                       str2                                          answer

FRANCE french 16384

위의 경우 두 글자씩 끊어 해쉬맵에 저장했습니다.

hm1 = {FR, AN, CE}

hm2 = {fr, en, ce}

모두 저장한 후에

 

교집합과 합집합의 경우 해쉬맵을 이용해서 구하였는데,

교집합은 해쉬맵 hm1을 순회하여 해당 key가 hm2에도 있다면 교집합이므로 intersection에 hm1, hm2 둘 중 최솟값을 더하여 줍니다.

 

합집합은 해쉬맵 hm1과 hm2를 순회하면서 해당 key의 값을 sum에 모두 더합니다.

그 다음, 중복되는 값 intersection이 생기므로 sum -= intersection으로 처리했습니다.