코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스 (programmers.co.kr)
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
풀이)
알고리즘)
- strs배열에 문자열을 2글자씩 추출해낸다.(동시에 특수문자, 숫자, 공백을 제거한다)
- strs 원소의 길이가 1보다 클 경우에만 map에 추가한다.(map1, map2)
- 이 때, 문자열을 키 값으로 사용하고 동일한 키 값의 갯수만큼을 Value로 지정한다)
- map1을 탐색하며 현재 키 값이 map2에도 존재한다면
- intersection에는 map1, map2의 value중 작은값을 union에는 큰 값을 더해준다.
- 존재하지 않다면 union에 map1의 value값을 더해준다.
- map2를 탐색하며 현재 키 값이 map1에 존재하지 않을 경우에만 union에 map2의 value값을 더해준다.
코드)
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.HashMap;
import java.util.*;
import java.lang.Math;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
Map<String,Integer> map1 = new HashMap<String,Integer>();
Map<String,Integer> map2 = new HashMap<String,Integer>();
float union = 0;
float intersection = 0;
String match = "[^\uAC00-\uD7A3xfe0-9a-zA-Z\\s]"; //특수문자 제거준비
String[] strs1 = new String[str1.length() - 1];
String[] strs2 = new String[str2.length() - 1];
for(int i = 0 ; i < str1.length() - 1;i++)
{
strs1[i] = str1.substring(i,i+2);
strs1[i] = strs1[i].replaceAll(match, " "); //특수문자 제거
strs1[i] = strs1[i].toUpperCase(); // 대문자 변환
strs1[i] = strs1[i].replaceAll("[0-9]",""); // 숫자 제거
strs1[i] = strs1[i].replaceAll(" ",""); // 공백 제거
}
for(String key : strs1)
{
if(key.length() > 1)
map1.put(key, map1.getOrDefault(key,0) + 1);
}
System.out.println(map1);
System.out.println();
for(int i = 0 ; i < str2.length() - 1;i++)
{
strs2[i] = str2.substring(i,i+2);
strs2[i] = strs2[i].replaceAll(match, " ");
strs2[i] = strs2[i].toUpperCase();
strs2[i] = strs2[i].replaceAll("[0-9]","");
strs2[i] = strs2[i].replaceAll(" ","");
}
for(String key : strs2)
{
if(key.length() > 1)
map2.put(key, map2.getOrDefault(key,0) + 1);
}
System.out.println(map2);
for (Map.Entry entry : map1.entrySet()) {
if(map2.containsKey(entry.getKey())) //
{
intersection += Math.min(map2.get(entry.getKey()),(int)entry.getValue());
union += Math.max(map2.get(entry.getKey()),(int)entry.getValue());
}
else
{
//intersection += map1.get(entry.getKey());
union += map1.get(entry.getKey());
}
}
for (Map.Entry entry : map2.entrySet()) {
if(map1.containsKey(entry.getKey())) //
{
continue;
}
else
{
//intersection += map2.get(entry.getKey());
union += map2.get(entry.getKey());
}
}
System.out.printf("intersection: %f union: %f",intersection,union);
if(intersection == 0 && union == 0)
answer = 65536;
else
answer = (int)((intersection/union) * 65536);
System.out.printf("answer %d",answer);
return answer;
}
}