중복 집합일 경우에 합집합을 구하는 것이 어려움이 있었다.
ex) {11,11,11,11} + {11,11} = {11,11,11,11}
집합 자체가 중복을 허용하므로 set은 사용하면 안되고, map으로 횟수를 세서 직접 합집합을 구해서 풀었다.
static public boolean check(String str) {
if(Character.isAlphabetic(str.charAt(0)) && Character.isAlphabetic(str.charAt(1))) return true;
return false;
}
static public int solution(String str1, String str2) {
HashMap<String,Integer> arr1 = new HashMap<>();
HashMap<String,Integer> arr2 = new HashMap<>();
for (int i = 0; i < str1.length()-1; i++) {
String newString = str1.substring(i,i+2);
if(check(newString)) {
arr1.put(newString.toLowerCase(),arr1.getOrDefault(newString.toLowerCase(), 0) + 1);
}
}
for (int i = 0; i < str2.length()-1; i++) {
String newString = str2.substring(i,i+2);
if(check(newString)) {
arr2.put(newString.toLowerCase(),arr2.getOrDefault(newString.toLowerCase(), 0) + 1);
}
}
if(arr1.size() == 0 && arr2.size() == 0) return 65536;
Iterator<String> it1 = arr1.keySet().iterator();
Iterator<String> it2 = arr2.keySet().iterator();
int addNum = 0, subNum = 0; // 교집합 합집합
while(it1.hasNext()) {
String key = it1.next();
if(arr2.containsKey(key)) {
addNum += Math.min(arr1.get(key),arr2.get(key));
subNum += Math.max(arr1.get(key),arr2.get(key));
} else {
subNum += arr1.get(key);
}
}
while(it2.hasNext()) {
String key = it2.next();
if(arr1.containsKey(key)) {
continue;
} else {
subNum += arr2.get(key);
}
}
return (int)((double)addNum/subNum*65536);
}
map.put(key,map.getOrDefault(key, 0) + 1);
-> 이 표현 기억하기!!
key가 없으면 0을 반환, 있으면 해당 값을 반환
character가 알파벳임을 알아내고 싶을 때는 Character.isAlphabetic함수 사용!!
처음에 'A' <= character <='z'로 하면 알파벳이 검증되는 줄 알았는데,,
웬걸,, 사이에 저런 특수기호들이 있었다ㅎㅎ
확실히 검증한다음에 사용하기!