문제 링크
뉴스 클러스터링
풀이
- 엄청나게 어려운 건 없었는데 헷갈리는 부분이 많았다.
- 합집합 구할 때, 그냥 아무생각 없이 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) {
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;
}
}