ALGORITHM/PROGRAMMERS

[프로그래머스] 뉴스 클러스터링 (2018 KAKAO BLIND RECRUITMENT)

0298 2021. 1. 2. 18:38

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

 

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

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

programmers.co.kr

2021-01-02


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
import java.util.ArrayList;
import java.util.regex.Pattern;
 
public class Solution17677 {
    public static boolean check(String str) {
        String pattern = "^[a-z]*$*";
        boolean result = Pattern.matches(pattern, str);
        return result;
    }
    public static int solution(String str1, String str2) {
        str1 = str1.toLowerCase(); // lowercase로 맞춤
        str2 = str2.toLowerCase();
        
        ArrayList<String> s1 = new ArrayList<>();
        ArrayList<String> s2= new ArrayList<>();
        
        for(int i = 0; i < str1.length()-1; i++) {
            String st = str1.substring(i, i+2);
            if(check(st)) s1.add(st);
        }
        
        for(int i = 0; i < str2.length()-1; i++) {
            String st = str2.substring(i, i+2);
            if(check(st)) s2.add(st);
        }
        
        double hap = s1.size() + s2.size();
        double gyo = 0;
 
        for(int i = 0; i < s1.size(); i++) {
            loop:for(int j = 0; j < s2.size(); j++) {
                if(s1.get(i).equals(s2.get(j))) {
                    gyo++;
                    s2.remove(j);
                    break loop;
                }
            }
        }
        if(gyo == 0 && hap == 0return 65536;
        hap -= gyo;
        return (int) ((gyo / hap) * 65536);
    }
 
    public static void main(String[] args) {
 
        String a = "E=M*C^2";
        String b = "e=m*c^2";
        
        System.out.println(solution(a, b));
    }
}
cs

 

#문제풀이

1. 문제 조건에서 대소문자를 구분하지 않으므로, "소문자"로 통일 시켰다.

2. 각각의 문자열을 substring을 이용하여 두 개씩 쪼개면서, pattern을 이용하여 소문자 문자열인지(특수기호가 들어가지 않았는지)를 체크하였다. 특수문자가 아닌경우 arraylist에 추가하였다.

3. 앞에서 구한 각각의 문자열의 집합에서 같은 문자열이 있는지 체크하였다. 

4. 교집합의 개수도 0이고 합집합의 개수도 0일때는 65536을 리턴할 수 있도록 하였다.  (테스트 케이스 5, 13번을 틀리면 이 부분을 체크해봐야한다.)

5. 그 외의 경우, 합집합의 개수는 각각의 문자열에서 뽑아낸 문자열의 개수에서 교집합의 개수를 뺀 값으로 저장하였다. 그리고 (교집합/합집합)*65536 을 계산하여 리턴하였다.