프로그래머스 lv2 뉴스 클러스터링

namkun·2023년 1월 15일
0

코딩테스트

목록 보기
61/79

문제 링크

뉴스 클러스터링

풀이

  • 엄청나게 어려운 건 없었는데 헷갈리는 부분이 많았다.
  • 합집합 구할 때, 그냥 아무생각 없이 Set을 썼다가는 중복되는 요소들이 제거되면서 답이 이상하게 나오기도 했고, 교집합을 구할 때, retainAll() 메서드를 사용했다가 원하는대로 교집합이 안나오기도 했다.
  • 자카드 연산의 규칙상 0을 처리하는 방법도 중간중간 빼먹고 해서 하나하나 넣어주었다.
  • 결론은 그냥 직접했다.
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class Solution {
    public int solution(String str1, String str2) {
        int intersection = getIntersection(splitString(str1), splitString(str2));
        int union = getUnion(splitString(str1), splitString(str2), intersection);

        if(intersection == 0 && union == 0) {
            return 65536;
        }

        if(intersection == 0) { // union > 0
            return 0;
        }

        double v = (double) intersection / union;

        return (int) (v * 65536);
    }

    private List<String> splitString(String str) {
        List<String> list;

        String[] splitString = str.split("");
        list = IntStream.range(0, splitString.length - 1)
                .filter(i -> checkMatch(splitString[i], splitString[i + 1]))
                .mapToObj(i -> (splitString[i] + splitString[i + 1]).toLowerCase())
                .collect(Collectors.toList());

        return list;
    }

    private boolean checkMatch(String str1, String str2) {
        return (str1.matches("[a-zA-Z]") && str2.matches("[a-zA-Z]"));
    }

    private int getIntersection(List<String> list1, List<String> list2){
        List<String> intersection = new ArrayList<>();

        list1.stream()
                .filter(list2::contains)
                .forEach(s -> {
                    intersection.add(s);
                    list2.remove(s);
                });

        return intersection.size();
    }

    private int getUnion(List<String> list1, List<String> list2, int intersectionSize){
        return list1.size() + list2.size() - intersectionSize;
    }
}
profile
개발하는 중국학과 사람

0개의 댓글