이번에 풀어본 문제는
프로그래머스 뉴스 클러스터링 입니다.
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
int str1Length = str1.length();
int str2Length = str2.length();
String str1Low = str1.toLowerCase();
String str2Low = str2.toLowerCase();
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
double intersection = 0.0;
double union = 0.0;
for (int i = 0; i < str1Length - 1; i++) {
char fst = str1Low.charAt(i);
char sec = str1Low.charAt(i + 1);
if (bothAlpha(fst, sec)) {
String key = fst + "" + sec;
map1.put(key,map1.getOrDefault(key, 0) + 1);
}
}
for (int i = 0; i < str2Length - 1; i++) {
char fst = str2Low.charAt(i);
char sec = str2Low.charAt(i + 1);
if (bothAlpha(fst, sec)) {
String key = fst + "" + sec;
map2.put(key,map2.getOrDefault(key, 0) + 1);
}
}
if (map1.size() == 0 && map2.size() == 0) return 65536;
for (String key : map1.keySet()) {
if (map2.containsKey(key)) {
intersection += Math.min(map1.get(key), map2.get(key));
union += Math.max(map1.get(key), map2.get(key));
map2.remove(key);
}
else {
union += map1.get(key);
}
}
for (String key : map2.keySet()) {
union += map2.get(key);
}
answer = (int)Math.floor((intersection / union) * 65536);
return answer;
}
static boolean bothAlpha(char fst, char sec) {
return fst >= 97 && sec >= 97 && fst <= 122 && sec <= 122;
}
}
문제에 주어진 조건에 따라 교집합 / 합집합을 구하는 문제입니다.
다중집합에 대한 교집합, 합집합은 문제에 주어진대로 min, max로 계산했고 HashMap으로 카운트를 처리했습니다.
주어진 두 문자열이 모두 공집합일 경우만 별도로 체크해주면, 위의 방식으로 해결할 수 있습니다.
다중집합이란 개념을 처음 들어봐서 문제를 이해하는 데 시간이 조금 걸렸습니다.