원문 : https://programmers.co.kr/learn/courses/30/lessons/17677
이 문제를 풀지 못했습니다. 아래의 테스트케이스에서 실패합니다
테스트허쉴("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);
}
}