J(A,B) 에서 A,B 모두 0인 경우 → 1이다.
먼저, 각 문자열을 두 글자씩 끊어서, 글자 쌍을 추출하는것이 필요
그 결과 map1, map2 가 탄생한다.
교집합
합집합
유사도 구하기
import java.util.*;
class Solution {
public Map<String, Integer> map1 = new HashMap<>();
public Map<String, Integer> map2 = new HashMap<>();
public int solution(String str1, String str2) {
int union = 0, inter = 0;
extract(str1, map1);
extract(str2, map2);
inter = map1.entrySet()
.stream()
.map(e -> Integer.min(e.getValue(), map2.getOrDefault(e.getKey(), 0)))
.reduce((a, b) -> a + b).orElseGet(()->0);
union = map1.entrySet()
.stream()
.map(e -> Integer.max(e.getValue(), map2.getOrDefault(e.getKey(), 0)))
.reduce((a, b) -> a + b).orElseGet(()->0);
union += map2.entrySet()
.stream()
.filter(e -> map1.get(e.getKey()) == null)
.map(e -> e.getValue())
.reduce((a,b) -> a+b).orElseGet(()->0);
if(union != 0) return (int)(inter/(double)union * 65536);
else return 65536;
}
public void extract(String str, Map<String, Integer> map) {
int len = str.length() - 1; // pair 를 만들어야 하기 때문
String temp = null;
str = str.toLowerCase();
for (int idx = 0; idx < len; idx++) {
if (!isAlpha(str.charAt(idx)))
continue;
if (!isAlpha(str.charAt(idx + 1)))
continue;
temp = str.substring(idx, idx + 2);
map.put(temp, map.getOrDefault(temp, 0) + 1);
}
}
public boolean isAlpha(char ch) {
if (ch < 'a' || ch > 'z')
return false;
return true;
}
}