뉴스 클러스터링 Java풀이

Sorbet·2022년 2월 13일
0
테스트허쉴("FRANCE", "french", 16384);

작성한 코드

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

// 못품
// https://programmers.co.kr/learn/courses/30/lessons/17677
public class Solution17677 {

    public int solution(String str1, String str2) {
        str2 = str2.toUpperCase();
        str1 = str1.toUpperCase();

        List<String> list1 = deCompositionAndSort(str1);
        List<String> list2 = deCompositionAndSort(str2);

        //교집합 구하기
        List<String> intersection = new ArrayList<>(list1).stream()
                .filter(s -> Collections.binarySearch(list2, s) != -1)
                .sorted(Comparator.naturalOrder())
                .collect(Collectors.toList());

        //합집합 구하기 : 교집합은 a,b,집합의 단순합에서 합집합원소를 제거하면 됨
        List<String> union = new ArrayList<>(list1);
        union.addAll(list2);
        union.sort(Comparator.naturalOrder());
        intersection.forEach(s -> {
            int index = Collections.binarySearch(union, s);
            if (index == -1) {
                throw new RuntimeException();
            }
            union.remove(index);
            union.sort(Comparator.naturalOrder());
        });

        //자카드 유사도 구하기
        return (union.size() == 0) ? 65536 : (int) (((double) intersection.size() / (double) union.size()) * 65536);
    }

    //함수형으로 짜고싶다.. >> reduce 사용해 개선
    /*
    0 1 2 3 :
     */
    private List<String> deCompositionAndSort(String str) {
        List<String> result = new ArrayList<>();
        for (int i = 0; i < str.length() - 1; i++) {
            char head = str.charAt(i);
            char tail = str.charAt(i + 1);
            if (Character.isLetter(head) && Character.isLetter(tail)) {
                String element = str.substring(i, i + 2);
                result.add(element);
            }
        }
        result.sort(Comparator.naturalOrder());
        return result;
    }

    public static void main(String[] args) {
        테스트허쉴("FRANCE", "french", 16384);
        테스트허쉴("aa1+aa2", "AAAA12", 43690);
        테스트허쉴("handshake", "shake hands", 65536);
    }

    private static void 테스트허쉴(String in1, String in2, int expected) {
        Solution17677 s = new Solution17677();
        int result = s.solution(in1, in2);
        System.out.println(result == expected ? "SUCCESS!!!" : "FAIL result: " + result + ",  but expected: " + expected);
    }


}
profile
Sorbet is good...!

0개의 댓글