문제 설명
해결과정
Solution.java
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 65536;
// 문자열을 부분집합으로 분리
LinkedList<String> strOne = strToLinkList(str1);
LinkedList<String> strTwo = strToLinkList(str2);
// 교집합의 크기
float min = intersection(strOne, strTwo);
// 합집합의 크기
float max = strOne.size() + strTwo.size() - min;
// 자카드 유사도 구하기
if(min != 0 && max != 0) {
float jacad = min / max;
answer = (int) (jacad * 65536);
}
if(min == 0 && max != 0) {
answer = 0;
}
return answer;
}
// 문자열을 부분집합으로 분리
public LinkedList<String> strToLinkList(String str) {
LinkedList<String> list = new LinkedList<>();
str = str.toLowerCase();
int end = 2;
for(int start = 0; end <= str.length(); start++) {
String substr = str.substring(start, end);
if(isEng(substr)) {
list.add(substr);
}
end++;
}
return list;
}
// 부분집합이 영어로만 이루어져 있는지 판별
public boolean isEng(String str) {
if(97 <= (int) str.charAt(0) && (int) str.charAt(0) <= 122) {
if(97 <= (int) str.charAt(1) && (int) str.charAt(0) <= 122) {
return true;
}
}
return false;
}
// 교집합 개수 반환
public int intersection(LinkedList<String> strOne, LinkedList<String> strTwo) {
LinkedList<String> smaller;
LinkedList<String> larger;
if (strOne.size() < strTwo.size()) {
smaller = new LinkedList<>(strOne);
larger = new LinkedList<>(strTwo);
} else {
smaller = new LinkedList<>(strTwo);
larger = new LinkedList<>(strOne);
}
int count = 0;
for(String str : smaller) {
if(larger.contains(str)) {
count++;
larger.remove(str); // 교집합에 속하는 원소를 제거
}
}
return count;
}
}
Java
복사