본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] [1차] 뉴스 클러스터링

by 현장 2026. 3. 28.

-Code

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        // str1의 유사도 검색을 위한 단어 집합 셋팅
        str1 = str1.toLowerCase();
        List<String> strList1 = new ArrayList<>();
        for (int i = 1; i < str1.length(); i++) {
            char c1 = str1.charAt(i - 1);
            char c2 = str1.charAt(i);

            if (Character.isAlphabetic(c1) && Character.isAlphabetic(c2)) {
                strList1.add("" + c1 + c2);
            }
        }
        // str2의 유사도 검색을 위한 단어 집합 셋팅
        str2 = str2.toLowerCase();
        List<String> strList2 = new ArrayList<>();
        for (int i = 1; i < str2.length(); i++) {
            char c1 = str2.charAt(i - 1);
            char c2 = str2.charAt(i);
            if (Character.isAlphabetic(c1) && Character.isAlphabetic(c2)) {
                strList2.add("" + c1 + c2);
            }
        }
        // 교집합과 합집합 갯수 구하기
        List<String> intersection = new ArrayList<>();
        List<String> union = new ArrayList<>();
        for (String word : strList1) {
            if (strList2.remove(word)) {
                intersection.add(word);
            }
            union.add(word);
        }
        // 합집합 갯수 구하기
        for (String word : strList2) {
            union.add(word);
        }
        // 합집합이 0인 경우 1로 처리함
        if (union.isEmpty()) return 65536;
        // 실수 연산을 위한 변수
        double similarity = (double) intersection.size() / union.size();
        return (int) (similarity * 65536);
    }
}

처음에 다중 집합인데 잘못 이해하여 중복이 허용 안 되는 줄 알고 set을 사용해서 틀렸었고 list로 변경해서 해결했으나 합집합을 만드는 부분에서 막혀 좀 찾아보니 remove를 통해 해결했습니다. 

추가적으로 유사도 구하는 수식에서 합집합이 0인 경우 1로 처리해야 하는데 실수로 빼먹어서 해당 부분도 추가하여 수정했습니다.