https://programmers.co.kr/learn/courses/30/lessons/17677
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
1. 유형
해시맵, 구현
2. 로직
- 모두 대문자로 변환
- 2자리씩 끊어서 {문자열, 갯수} 형태의 딕셔너리 만든다
- str1, str2의 딕셔너리의 key값으로 합집합, 교집합을 구한다
refine함수를 통해 "aa1+aa2"문자열을 {aa:2 } 해쉬맵으로 리턴해준다.
교집합 합집합은 contains라이브러리를 사용하여 판단.
3. 코드
import java.util.*;
import java.util.regex.*;
class Solution {
public int solution(String str1, String str2) {
HashMap<String, Integer> map1 = refine(str1);
HashMap<String, Integer> map2 = refine(str2);
int inter=0, sum =0;
for(Map.Entry<String, Integer> entryset: map1.entrySet()){
String key = entryset.getKey();
if(map2.containsKey(key)){
int v2 = map2.get(key);
int v1 = map1.get(key);
inter += Math.min(v1, v2);
sum += Math.max(v1, v2);
}else{
sum += map1.get(key);
}
}
for(Map.Entry<String, Integer> entryset: map2.entrySet()){
String key = entryset.getKey();
if(!map1.containsKey(key)){
sum+=map2.get(key);
}
}
double temp;
if(inter ==0 && sum==0)
temp = 1;
else
temp = (double)inter/sum;
int answer = (int)(temp*65536);
return answer;
}
static HashMap<String, Integer> refine(String s){
s = s.toUpperCase();
char chrs[] = s.toCharArray();
HashMap<String, Integer> map = new HashMap<>();
String pattern = "[A-Z]";
for(int i=0; i<chrs.length-1; i++){
if(!Pattern.matches(pattern, String.valueOf(chrs[i])) ||
!Pattern.matches(pattern, String.valueOf(chrs[i+1])))
continue;
String temp = String.valueOf(chrs[i])+String.valueOf(chrs[i+1]);
map.put(temp, map.getOrDefault(temp, 0)+1);
}
return map;
}
}