알고리즘/프로그래머스 Level2

[프로그래머스,자바] Level2: 뉴스 클러스터링

류창 2021. 11. 3. 11:46
반응형

 

문제분석

 

뭔가 겁나많이 복잡한데, 요약하자면  A 집합과 B집합의 합집합과, 교집합을 구한뒤

 

교집합 갯수/합집합 갯수를 구하면된다.

 

A집합, B집합의 원소는 앞에서부터 2글자씩끊어서생성하고, 글자안에 특수문자가 들어있는경우는 제외한다.

 

예외) A,B모두 공집합일경우 1반환

 

 

풀이접근 -> 교집합을 먼저 구하자

 

교집합을 먼저구한다면 합집합은 A+B - 교집합 으로 구할수있다.

 

 

 

풀이방식:

 

1. 집합 A, 집합 B를 구한다.

->두글자씩 끊어서 A,B에저장한다.

2.두글자씩 끊은 원소가 특수문자가 들어있으면 제외한다.

->이 경우는 정규표현식이나 아스키코드를 통해서 제외한다.

 

3. A와 B의 교집합을구한다.

 

4. 합집합공식을 사용해 갯수를 구하고  교집합/합집합을 구한다.

 

5.문제에서 65536곱하라고하니 곱한다.

 

문제풀이

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
import java.util.*;
class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        List<String> A=new ArrayList<>();
        for(int i=0;i<str1.length()-1;i++){
            String temp=str1.substring(i,i+2).toUpperCase();
            if(temp.matches(".*[^A-Z].*")){
                continue;
            }
            A.add(temp);
        }    
        List<String> B=new ArrayList<>();
        for(int i=0;i<str2.length()-1;i++){
            String temp=str2.substring(i,i+2).toUpperCase();
            if(temp.matches(".*[^A-Z].*")){
                continue;
            }
            B.add(temp);
        }
        double intersection=0;
        double union=A.size()+B.size();
        for(int i=0;i<A.size();i++){
            if(B.contains(A.get(i))){
                intersection+=1;
                B.remove(A.get(i));
            }
        }
        union-=intersection;
        double jakard =intersection/union;
        if(intersection==0&&union==0){
            return 65536;
        }
        
        return answer=(int)(65536*jakard);
    }
}
cs
반응형