코딩/알고리즘

[알고리즘] 프로그래머스 뉴스 클러스터링

유어노우 2022. 1. 12. 11:05

- 문제

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

 

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

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

programmers.co.kr

 

- 코드 설명

처음 문제를 풀기 시작했을 때 HashMap을 사용하여 풀면 간단하다고 생각했으나 이것은 확장된 자카드 유사도가 아닌것을 알았고 ArrayList로 변환 후 교집합을 구하기 위해 각각의 ArrayList를 정렬했습니다.

 

집합의 원소는 정규식을 사용하여 구했습니다.

 

 

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        ArrayList<String> set1 = new ArrayList<>();
        ArrayList<String> set2 = new ArrayList<>();
        
        makeSet(str1, set1);
        makeSet(str2, set2);
        
        if(set1.size() + set2.size() == 0) return 65536;
        
        Collections.sort(set1);
        Collections.sort(set2);
        
        answer = (int)(makeJ(set1,set2) * 65536);
        return answer;
    }
    
   
    private double makeJ(ArrayList<String> set1 , ArrayList<String> set2){
        int countUnion = 0;
        int countIntersection = 0;
        int idx = 0, len1, len2;
        
        len1 = set1.size();
        len2 = set2.size();
        
        for(int i=0; i<len1; i++){
            for(int j=idx; j<len2; j++){
                if(set1.get(i).equals(set2.get(j)) == true) {
                    countIntersection++;
                    idx = j+1;
                    break;
                }
            }
        }
        countUnion = set1.size() + set2.size() - countIntersection;
        return countIntersection/(double)countUnion;
    }
    
    private void makeSet(String str , ArrayList<String> set){
        int len = str.length();
        for(int i=0; i<len-1; i++){
            String temp = str.substring(i,i+2);
            if(temp.matches("^[a-zA-Z]*$")){
                temp = temp.toUpperCase();
                set.add(temp);
            }
        }
    }
}

 

- 결과