[programmers] 뉴스 클러스터링

김태민·2022년 5월 14일
0

알고리즘

목록 보기
62/77

mingssssss

1. 문제

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


2. 코드

import java.util.*;

// 자카드 유사도: 두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값.
// 두 집합 모두 공집합일 경우 1로 정의.

class Solution {
    
    static String[] s1;
    static String[] s2;
    static int s1_size;
    static int s2_size;
    static ArrayList<String> list1;
    static ArrayList<String> list2;
    static boolean flag;
    
    public int solution(String str1, String str2) {
        double answer = 0;
        
        s1_size = str1.length();
        s2_size = str2.length();
        
        s1 = str1.split("");
        s2 = str2.split("");
        
//         char c = charAt('F');
//         int num = (int)c;
        
        list1 = new ArrayList<>();
        list2 = new ArrayList<>();
        ArrayList<String> union = new ArrayList<>();
		ArrayList<String> intersection = new ArrayList<>();
        
        split_one(s1);
        split_two(s2);
        


        
        // 중복 원소 처리를 위해 두 집합 정렬
		Collections.sort(list1);
		Collections.sort(list2);
		
		// 교집합 구하기 
		for(String s : list1) {
			if(list2.remove(s)) { // 집합1에 집합2가 포함된다면 삭제후, 교집합에 추가 
				intersection.add(s);
			}
			union.add(s);
		}
		
		// 합집합 구하기 
		for(String s : list2) { // 교집합에서 제외된 것 뺀 나머지 합집합에 추가 
			union.add(s);
		}
        double a = intersection.size();
		double b = union.size();
        
        double jakard = 0;
	
		if(union.size() == 0)
			jakard = 1;	// 공집합일 경우 1
		else
			jakard = (double) intersection.size() / (double) union.size();

		return (int) (jakard * 65536);
    }
    
    private static void split_one(String[] s) {
        
        String temp = "";
        flag = false;
        for (int i = 0; i < s1_size; i++) {
            
            // System.out.println(i + " idx");
            if ((int)s[i].charAt(0) < 65 || ((int)s[i].charAt(0) > 90 && (int)s[i].charAt(0) < 97) ||(int)s[i].charAt(0) > 127) {
                flag = true;
                continue;
            }
            
            temp += s[i].toUpperCase();
            System.out.println(temp + " temp");
            
            if (temp.length() == 2 && flag == true) {
                temp = "";
                flag = false;
                i--;
                continue;
            }
            
            if (temp.length() == 2) {
                list1.add(temp);
                temp = "";
                i--;
            }
        }
    }
    
     private static void split_two(String[] s) {
        
        String temp = "";
        flag = false;
        for (int i = 0; i < s2_size; i++) {
            
             if ((int)s[i].charAt(0) < 65 || ((int)s[i].charAt(0) > 90 && (int)s[i].charAt(0) < 97) ||(int)s[i].charAt(0) > 127) {
                flag = true;
                continue;
            }
            
            temp += s[i].toUpperCase();
            // System.out.println(temp + " temp");
                        
            if (temp.length() == 2 && flag == true) {
                temp = "";
                flag = false;
                i--;
                continue;
            }
            
            if (temp.length() == 2) {
                list2.add(temp);
                temp = "";
                i--;
            }
        }
    }       
}

3. 리뷰

스킬 체크 2단계를 계속 도전하고 있는데, 2단계에서 첫 번째 문제도

못 풀고 있다... 매번 새로운 내용이라 꼭꼭 정리하고 넘어가고 있다.

문제가 길어 힘들 거 같았지만, 문제 자체는 쉬운 내용이었다.

2글자로 잘라야 하는데, 무조건 2글자씩 겹쳐서 자르되, 공백이나 특수문자가

섞여있으면 그 부분을 통째로 날려버리고 그 다음부터 또 2개씩 자른다.

자른 문자들을 중복 체크하기위해 sort해서 for문을 돌린다.

리스트에서 값을 하나씩 꺼내와서 체크한다

// 교집합 구하기 
		for(String s : list1) {
			if(list2.remove(s)) { // 집합1에 집합2가 포함된다면 삭제후, 교집합에 추가 
				intersection.add(s);
			}
			union.add(s);
		}
		
		// 합집합 구하기 
		for(String s : list2) { // 교집합에서 제외된 것 뺀 나머지 합집합에 추가 
			union.add(s);
		}
        double a = intersection.size();
		double b = union.size();

(출처: https://minhamina.tistory.com/108)

첫 번째 if문의 조건의 뜻은, '만약 list2에 s를 remove 할 수 있다면'

라는 뜻이다. 그때 intersection 리스트에 값을 추가해주고,

합집합은 공통이니 union 리스트에도 값을 추가해준다.

그리고 합집합은 교집합에서 제외된 값을 뺀 나머지 값을 추가해주면 된다.

이 문제에서 교집합, 합집합을 다루는 법을 익혔으며, 정규식으로도 많이들 푸셨는데

그 부분도 확인해보고, 함수나 코드를 좀 더 깔끔하게 정리할 수 있도록

노력해야겠다.

profile
어제보다 성장하는 개발자

0개의 댓글