사용한 것
풀이 방법
str1
, str2
를 소문자로 만들고 두 글자씩 끊어 map1
, map2
에 1 저장
- 중복된 문자면 value 1 증가
- 공백, 숫자, 기호 등이 포함되면 추가 X
map3
에 교집합 넣어줌
map4
에 합집합 넣어줌
map3
, map4
에 저장된 모든 value를 더하여 답을 구해 리턴
- 교집합, 합집합이 둘다 0인 경우 65536 반환
코드
class Solution {
public int solution(String str1, String str2) {
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
Map<String, Integer> map3 = new HashMap<>();
Map<String, Integer> map4 = new HashMap<>();
for(int i = 0; i < str1.length() - 1; i++) {
char c1 = str1.charAt(i);
char c2 = str1.charAt(i + 1);
if(c1 < 97 || c1 > 122 || c2 < 97 || c2 > 122) {
continue;
}
String str = String.valueOf(c1) + c2;
map1.put(str, map1.getOrDefault(str, 0) + 1);
}
for(int i = 0; i < str2.length() - 1; i++) {
char c1 = str2.charAt(i);
char c2 = str2.charAt(i + 1);
if(c1 < 97 || c1 > 122 || c2 < 97 || c2 > 122) {
continue;
}
String str = String.valueOf(c1) + c2;
map2.put(str, map2.getOrDefault(str, 0) + 1);
}
for(String key : map1.keySet()) {
int value1 = map1.get(key);
int value2 = 0;
if(map2.containsKey(key)) {
value2 = map2.get(key);
}
if(value2 > 0) {
map3.put(key, Math.min(value1, value2));
}
}
for(String key : map1.keySet()) {
int value = map1.get(key);
map4.put(key, value);
}
for(String key : map2.keySet()) {
int value = map2.get(key);
if(map4.containsKey(key)) {
map4.put(key, Math.max(value, map4.get(key)));
} else {
map4.put(key, value);
}
}
int andNum = 0;
for(String key : map3.keySet()) {
andNum += map3.get(key);
}
int orNum = 0;
for(String key : map4.keySet()) {
orNum += map4.get(key);
}
return andNum == 0 && orNum == 0 ? 65536 : (int) (((double) andNum / orNum) * 65536);
}
}