Contents
내가 작성한 코드

내가 작성한 코드
import java.util.*;
public class Solution {
public static int solution(String str1, String str2) {
// 각각의 문자열로부터 유효한 2글자 조합(영문자만)을 추출
List<String> list1 = makeBigrams(str1);
List<String> list2 = makeBigrams(str2);
// 각 리스트에 포함된 원소들의 출현 횟수를 세어 Map으로 변환
Map<String, Integer> map1 = getCountMap(list1);
Map<String, Integer> map2 = getCountMap(list2);
int intersection = 0; // 교집합 크기
int union = 0; // 합집합 크기
// 두 map에서 사용된 모든 key들을 집합으로 통합
Set<String> allKeys = new HashSet<>();
allKeys.addAll(map1.keySet());
allKeys.addAll(map2.keySet());
for (String key : allKeys) {
int count1 = map1.getOrDefault(key, 0);
int count2 = map2.getOrDefault(key, 0);
// 교집합은 각 원소별 최소값
intersection += Math.min(count1, count2);
// 합집합은 각 원소별 최대값
union += Math.max(count1, count2);
}
// 둘 다 공집합이면 유사도는 1로 간주
if (union == 0) {
return 65536;
};
// 유사도를 65536을 곱한 정수로 반환
return (int) ((double) intersection / union * 65536);
}
// 문자열에서 2글자씩 끊고 영문자인 경우만 리스트로 반환
private static List<String> makeBigrams(String str) {
List<String> result = new ArrayList<>();
str = str.toLowerCase(); // 대소문자 구분 없이 비교
for (int i = 0; i < str.length() - 1; i++) {
char c1 = str.charAt(i);
char c2 = str.charAt(i + 1);
// 두 글자 모두 알파벳이면 유효한 쌍으로 추가
if (Character.isLetter(c1) && Character.isLetter(c2)) {
result.add("" + c1 + c2);
}
}
return result;
}
// 리스트에 있는 각 문자열의 등장 횟수를 세어 Map으로 반환
private static Map<String, Integer> getCountMap(List<String> list) {
Map<String, Integer> map = new HashMap<>();
for (String s : list) {
map.put(s, map.getOrDefault(s, 0) + 1);
}
return map;
}
}
Share article