알고리즘 풀이/프로그래머스

[프로그래머스][JAVA] [1차] 뉴스 클러스터링 (문자열)

배게 2022. 3. 19. 07:57
728x90

하.. map에 부분집합 저장할 때 누적이 안되고 자꾸 1로 갱신된다.. getOrDefault 썼는데도 이러네

이유 찾았다 또 스펠링임 이거 프로그래머스 ide가 이상한게 컴파일 에러를 제대로 못찾는 것 같음

 

Line:60~61번

    subsetMap.put(subset, subsetMap.getOrDefault(subsetMap, 0)+1);

-> subsetMap.put(subset, subsetMap.getOrDefault(subset, 0)+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
57
58
59
60
61
62
63
64
65
66
67
68
import java.util.*;
 
class Solution {
    public int solution(String str1, String str2) {
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        
        // System.out.println(str1);
        // System.out.println(str1.matches("^[A-Z]*$"));
        
        double jacquard = getJacquard(str1, str2);
 
        
        return (int)(jacquard*65536);
    }
    
    private double getJacquard(String str1, String str2){
        Map<String,Integer> subsetMap1 = subsetMap(str1);
        Map<String,Integer> subsetMap2 = subsetMap(str2);
        
        // A, B 모두 공집합
        if(subsetMap1.size()+subsetMap2.size()==0return 1;
        
        int subsetNum1 = 0;
        int subsetNum2 = 0;
        int intersectionNum = 0// 교집합 숫자 
        
        for(Map.Entry<String,Integer> e : subsetMap1.entrySet()){
            // System.out.println(e.getKey()+" "+e.getValue());
            subsetNum1 += e.getValue();
        }
        for(Map.Entry<String,Integer> e : subsetMap2.entrySet()){
            // System.out.println(e.getKey()+" "+e.getValue());
            subsetNum2 += e.getValue();
        }
        for(Map.Entry<String,Integer> e : subsetMap1.entrySet()){
            intersectionNum += Math.min(e.getValue(), 
                                   subsetMap2.getOrDefault(e.getKey(), 0));
        }
        
        // System.out.println(subsetNum1);
        // System.out.println(subsetNum2);
        // System.out.println(intersectionNum);
        
        // 공집합은 A+B-(AnB)
        int cosetNum = subsetNum1 + subsetNum2 - intersectionNum;
        
        
        return intersectionNum/(double)cosetNum;
    }
    
    
    // str의 부분집합 subset을 분석한 map
    private Map<String, Integer> subsetMap(String str){
        Map<String, Integer> subsetMap = new HashMap<>();
        
        for(int i=0; i<str.length()-1; i++){
            String subset = str.substring(i,i+2);
            if(subset.matches("^[A-Z]*$")){
                subsetMap.put(subset, subsetMap
                              .getOrDefault(subset, 0)+1);
            }
        }
 
        return subsetMap;
    } 
}
 
cs