프로그래밍 공방

[프로그래머스] 뉴스 클러스터링 본문

개발/문제해결

[프로그래머스] 뉴스 클러스터링

hyosupsong 2020. 12. 30. 22:36

문제

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

 

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

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

programmers.co.kr

문제해결방법

1. 입력받은 2개의 문자열에 있는 모든 소문자를 대문자로 바꿔주었다.

2. 각 문자열을 돌면서 글자 쌍을 Key로, 글자 쌍이 나오는 수를 Value로 각각의 Map에 넣어주었다.

3. 두 Map의 Key를 비교해가면서 양쪽에 다 있는 Key만 더 작은 Value를 교집합으로 카운트했다.

4. 2번 과정에서 합집합의 크기를 구하고, 3번에서 구한 교집합의 크기를 통해 유사도를 계산해줬다.

코드

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
57
58
59
60
package Programmers;
 
import java.util.HashMap;
import java.util.Map;
 
public class Solution_뉴스클러스터링 {
 
    public static int makePair(String str, Map<String, Integer> map) {
        int count = 0;
        for(int i=0; i<str.length()-1; i++) {
            char first = str.charAt(i);
            char second = str.charAt(i+1);
            if(first < 'A' || first>'Z' || second < 'A' || second>'Z'continue;
            String temp = ""+first+second;
            if(map.containsKey(temp)) map.put(temp, map.get(temp)+1);
            else map.put(temp, 1);
            count++;
        }
        return count;
    }
    
    public static String toUpper(String str) {
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<str.length(); i++) {
            char ch = str.charAt(i);
            if(ch>='a' && ch <= 'z')  ch -= 32;
            sb.append(ch);
        }
        return sb.toString();
    }
    
    public static int solution(String str1, String str2) {
        int gyo = 0, hap = 0;
        int answer = 0
        if(str1.length()==0 || str2.length()==0return answer;
        str1 = toUpper(str1);
        str2 = toUpper(str2);
        Map<String, Integer> map1 = new HashMap<>(), map2 = new HashMap<>();
        hap += makePair(str1, map1);
        hap += makePair(str2, map2);
        for(String key : map1.keySet()) {
            int count = map1.get(key);
            if(map2.containsKey(key)) {
                count = Math.min(count, map2.get(key));
                gyo += count;
            }
        }
        hap -= gyo;
        System.out.println(gyo+" "+hap);
        answer = (int)((float)gyo/hap*65536);
        if(hap == 0) answer = 65536;
        return answer;
    }
    
    public static void main(String[] args) {
        String str1 = "E=M*C^2";
        String str2 = "e=m*c^2";
        System.out.println(solution(str1, str2));
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.