티스토리 뷰

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17677?language=java 

 

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

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

programmers.co.kr

 

2. 풀이

  • 문자열1과 문자열2의 다중집합을 구한다.
  • 다중집합 1과 다중집합 2의 교집합을 구한다. 
    • 다중집합 1과 다중집합 2의 원소가 겹치면, 다중집합 2에서 원소를 삭제하고 교집합에 추가한다.
    • 다중집합 1의 원소는 모두 합집합에 추가한다.
  • 다중집합 1과 다중집합 2의 합집합을 구한다. 
    • 다중집합 2의 남은 원소를 모두 합집합에 추가한다.
  • 자카드 유사도를 구한다.

 

3. 코드

 
import java.util.*;

class Solution {
    
    public int solution(String str1, String str2) {
        int answer = 0;
        ArrayList<String> multiSet1 = new ArrayList<String>();
        ArrayList<String> multiSet2 = new ArrayList<String>();
        ArrayList<String> intersect = new ArrayList<String>();
        ArrayList<String> union = new ArrayList<String>();
        
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        
        // str1 다중집합 만들기
        for(int i = 0; i < str1.length() - 1; i++){
            char c1 = str1.charAt(i);
            char c2 = str1.charAt(i + 1);
            
            if(Character.isLetter(c1) && Character.isLetter(c2)){
                multiSet1.add(Character.toString(c1) + Character.toString(c2));
            }
        }
        
        // str2 다중집합 만들기
        for(int i = 0; i < str2.length() - 1; i++){
            char c1 = str2.charAt(i);
            char c2 = str2.charAt(i + 1);
            
            if(Character.isLetter(c1) && Character.isLetter(c2)){
                multiSet2.add(Character.toString(c1) + Character.toString(c2));
            }
        }
        
        // 다중 집합 정렬
        Collections.sort(multiSet1);
        Collections.sort(multiSet2);
        
        // 교집합 구하기
        for(String s : multiSet1){
            if(multiSet2.remove(s)){
                intersect.add(s);
            }
            union.add(s);
        }
        
        // 합집합 구하기
        for(String s : multiSet2){
            union.add(s);
        }
        
        // 자카드 유사도 구하기
        float jakard = 0;
        
        if(union.size() == 0){
            jakard = 1; 
        }else{
            jakard = intersect.size() / (float)union.size();
        }
        
        
        return (int) (jakard * 65536);
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함