티스토리 뷰

 

 

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

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

programmers.co.kr

두 글자씩 끊어서 다중집합을 만드는 stringSlice 메서드를 만들어서 Map을 리턴해주었다.

위처럼 다중집합을 만들어준 뒤, 문제에서 제시된대로 자카드 유사도를 구해주면 마무리된다.

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(String str1, String str2) {
        final int VALUE = 65536;
        str1 = str1.toLowerCase().replaceAll("[^a-z]"," ");
        str2 = str2.toLowerCase().replaceAll("[^a-z]"," ");
        Map<String,Integer> A = stringSlice(str1);
        Map<String,Integer> B = stringSlice(str2);

        int intersectionCount = 0; // 교집합의 개수
        int unionCount = 0; // 합집합의 개수
        for(Map.Entry<String, Integer> entry : B.entrySet()) {
            String str = entry.getKey();
            int count = entry.getValue();

            // 없다면
            if(A.get(str) == null) {
                unionCount += count;
            } else if(A.get(str) >= count) {
                intersectionCount += count;
                unionCount += A.get(str);
            } else if(A.get(str) < count){
                intersectionCount += A.get(str);
                unionCount += count;
            }
        }
        for(Map.Entry<String, Integer> entry : A.entrySet()) {
            String str = entry.getKey();
            int count = entry.getValue();
            System.out.println("key : " + str);
            System.out.println(B.get(str));
            // 없다면
            if(B.get(str) == null) {
                unionCount += count;
            }
        }
        // System.out.println("intersection : " + intersectionCount);
        // System.out.println("union : " + unionCount);
        if(intersectionCount == 0 && unionCount == 0){
            return VALUE;
        }
        double jacard = (double) intersectionCount / (double) unionCount;
        return (int) (VALUE * jacard);
    }

    private Map<String,Integer> stringSlice(String str) {
        Map<String,Integer> result = new HashMap<>();

        for(int i = 0 ;i<str.length()-1;i++) {
            String string = str.substring(i,i+2);
            if(string.contains(" ")) {
                continue;
            }
            result.put(string, result.getOrDefault(string,0) + 1);
        }

        return result;
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함