[프로그래머스] 카카오_뉴스 클러스터링 (자바 풀이)

문제

https://programmers.co.kr/learn/courses/30/lessons/17677?language=java 

 

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

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

programmers.co.kr

풀이

이 문제는 정규표현식에 대해 알면 편하다. 우선 두 String의 문자열들을 추출해야 하는데, String의 처음부터 두 글자씩 끊어서 이것이 영문자로만 이루어져 있다면 HashMap 자료구조에 넣어준다. 여기서 영문자로만 이루어져 있는지 판단하는 것은 정규표현식을 이용할 수 있다. 만약 HashMap에 이미 값이 존재하면 value를 1 증가시키고 없다면 1로 만들어준다.

 

이렇게 모든 문자열 집합을 구했다면, 교집합과 합집합을 구하면된다. 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.*;
import java.util.regex.Pattern;
 
class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        Map<String, Integer> m1 = new HashMap<>();
        Map<String, Integer> m2 = new HashMap<>();
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        
        getPair(str1, m1);
        getPair(str2, m2);
        
        double diff = 0;
        double sum = 0;
        
        /* count */
        for(String key1 : m1.keySet()){
            if(m2.containsKey(key1)){
                diff += Math.min(m1.get(key1), m2.get(key1));
                sum += Math.max(m1.get(key1), m2.get(key1));
                m2.remove(key1);
            }else{
                sum += m1.get(key1);
            }
        }
      
        for(String key2 : m2.keySet()){
            sum += m2.get(key2);
        }
        
        
        if(diff == 0.0 && sum == 0.0){  // 둘 다 0이면
            answer = 65536;
        }else{
            answer = (int)((diff/sum)*65536);
        }
        
        return answer;
    }
    
    /* 문자열 추출하기 */
    public static void getPair(String str, Map<String, Integer> m){
        String pattern = "^[A-Z]*$";    // 영문자 정규표현식
        for(int i=0; i<str.length()-1; i++){
            String tmp = "";
            tmp += str.charAt(i);
            tmp += str.charAt(i+1);
            if(Pattern.matches(pattern, tmp)){  // 영문자인 경우만
                m.compute(tmp, (k,v) -> (v==null) ? 1 : v+1 );
            }
        }
    }
    
}
cs

결과

뉴스 클러스터링

반응형

댓글

Designed by JB FACTORY