Algorithm

[Programmers] 뉴스 클러스터링

프로그래민 2020. 5. 21. 18:07
반응형

자료구조를 이용하여 쉽게 풀수있는 문제이다.

Map자료구조를 이용하여 교집합과 합집합을 구하는 문제이다. 만일 두문자열다 가지고 있는 원소이면 교집할일땐 min값을, 합집합일땐 max값을 주어주는 방식으로 풀었다. 문제를 꼼꼼히 읽는게 중요한것 같다.

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package programmers;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
public class Solution_2018카카오_뉴스클러스터링 {
    public static void main(String[] args) {
        String str1="FRANCE"String str2="french";
//        String str1="handshake"; String str2="shake hands";
//        String str1="aa1+aa2"; String str2="AAAA12";
//        String str1="E=M*C^2"; String str2="e=m*c^2";
        
        System.out.println(solution(str1, str2));
    }
    
    
    static int solution(String str1, String str2) {
        int answer = 0;
 
        Map<String, Integer> map1=new HashMap<>();
        Map<String, Integer> map2=new HashMap<>();
 
        str1=str1.toLowerCase();
        str2=str2.toLowerCase();
        
        int total=0;
        int cross=0;
        
        for(int i=0;i<str1.length()-1;i++) {
            if(checkAlp(str1.charAt(i))&&checkAlp(str1.charAt(i+1))) {
                String word=str1.substring(i,i+2);
                if(map1.get(word)==null) {
                    map1.put(word, 1);
                }else {
                    map1.put(word, map1.get(word)+1);
                }
            }
        }
 
        for(int i=0;i<str2.length()-1;i++) {
            if(checkAlp(str2.charAt(i))&&checkAlp(str2.charAt(i+1))) {
                String word=str2.substring(i,i+2);
                if(map2.get(word)==null) {
                    map2.put(word, 1);
                }else {
                    map2.put(word, map2.get(word)+1);
                }
            }
        }
        
        Set<String> keys1=map1.keySet();
        Set<String> keys2=map2.keySet();
        
        
        for(String key1 :keys1) {
            if(map2.get(key1)==null) {
                total+=map1.get(key1);
            }else {
                total+=Math.max(map1.get(key1),map2.get(key1));
                cross+=Math.min(map1.get(key1),map2.get(key1));
                
            }
        }
        
        for(String key2:keys2) {
            if(map1.get(key2)==null) {
                total+=map2.get(key2);
            }
        }
        
        if(map1.size()==0 && map2.size()==0)
            answer=65536;
        else
            answer=65536*cross/total;
        
        
        return answer;
    }
    
    static boolean checkAlp(char ch) {
        if('a'<=ch &&ch<='z')
            return true;
        return false;
    }
}
 
                                                      
반응형

'Algorithm' 카테고리의 다른 글

[SWEA] 2112. 보호 필름  (0) 2020.05.23
[BOJ] 11967. 불켜기  (0) 2020.05.21
[Programmers] 프렌즈4블록  (0) 2020.05.21
[Programmers] 셔틀버스  (0) 2020.05.17
[BOJ] 2887. 행성 터널  (0) 2020.05.17