프로그래머스 - (Java)뉴스클러스터링
카테고리 없음

프로그래머스 - (Java)뉴스클러스터링

https://programmers.co.kr/learn/courses/30/lessons/17677

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

1. 유형

해시맵, 구현

 

2. 로직

  1. 모두 대문자로 변환
  2. 2자리씩 끊어서 {문자열, 갯수} 형태의 딕셔너리 만든다
  3. 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;
    }
}