🖇️ 문제 링크
📝 문제 분석
서로의 집합에 원소가 있는지 확인하는 연산을 해야하고, 중복되는 원소가 있을 수 있기때문에 자바에는 멀티셋이 없으므로 <String, Cnt> 형태의 맵을 사용합니다.
다중 집합 A의 글자쌍들을 <글자쌍, 개수>형태로 맵에 저장합니다.
이어서, 다중 집합 B의 글자쌍들을 순회하며 맵에 저장되어 있는 글자쌍이라면 교집합이므로 카운트합니다.
모든 글자쌍이 교집합을 이뤘다면 맵에서 삭제시켜줍니다.
⌨️ 코드
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
// 대소문자 무시, 중복 가능, 영어만 가능
Map<String, Integer> hm = new HashMap<>();
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
// 문자쌍 뽑아내기
List<String> list = new ArrayList<>();
for(int i = 0; i < str1.length() - 1; i++) {
if(!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1)))
continue;
hm.put(str1.substring(i, i + 2), hm.getOrDefault(str1.substring(i, i + 2), 0) + 1);
}
int inter = 0, union = 0;
for(int i = 0; i < str2.length() - 1; i++) {
if(!Character.isAlphabetic(str2.charAt(i)) || !Character.isAlphabetic(str2.charAt(i + 1)))
continue;
String str = str2.substring(i, i + 2);
if(hm.containsKey(str)) {
int cnt = hm.get(str);
if(cnt == 1)
hm.remove(str);
else
hm.put(str, cnt - 1);
inter++;
}
union++;
}
// 맵에 남아있는 원소 추가
for(int value : hm.values())
union += value;
if(union + inter == 0)
return 65536;
else
return (int)((inter / (double)union) * 65536);
}
}
Uploaded by Notion2Tistory v1.1.0