Algorithm/programmers

[2018 카카오 블라인드 1차]뉴스 클러스터링

마닐라 2022. 3. 28. 19:46

📍 문제 설명

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

 

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

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

programmers.co.kr

 

💡 접근

중복을 허용하는 다중 집합에 대해서 생각해봐야 하는 문제였다.

두 개의 리스트에서 겹치는 부분은 교집합으로 따로 만들어두고 해당 원소를 삭제하면

두 개의 리스트에 남는 집합들이 합집합의 원소들이 된다.

 

 

👩‍💻 코드

import java.io.*;
import java.util.*;

public class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();

        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        cutTwoString(str1, list1);
        cutTwoString(str2, list2);
        if(list1.isEmpty() && list2.isEmpty()) return 65536;

        ArrayList<String> intersection = new ArrayList<>();

        //교집합
        for(String s : list1) {
            if(list2.remove(s)) {
                intersection.add(s);
            }
        }

        int intersectionSize = intersection.size();
        int unionSize = list1.size() + list2.size();

        answer = (int) (((double) intersectionSize / unionSize) * 65536);
        System.out.println(answer);

        return answer;
    }

    private void cutTwoString(String str2, ArrayList<String> list2) {
        for(int lt = 0, rt = 1; rt < str2.length(); lt++,rt++) {
            StringBuilder sb = new StringBuilder();
            if(!Character.isLetter(str2.charAt(lt)) || !Character.isLetter(str2.charAt(rt))) continue;
            sb.append(str2.charAt(lt) + "" + str2.charAt(rt));
            list2.add(sb.toString());
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        Solution s = new Solution();
        s.solution("aa1+aa2", "AAAA12");
        System.out.println();
        s.solution("FRANCE", "french");
    }


}