본문 바로가기

CS/Algorithm

뉴스 클러스터링

반응형

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

 

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

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

programmers.co.kr

 

중복 집합을 구현해내는 것이 포인트

문제 설명에 짜잘한 조건들이 붙어 있어서 시간이 좀 걸렸다. (소문자 통일, 데이터는 영어로만 구성, 0 / 0이 null이 아니라는 것)

다시 느끼는거지만 IDE 없이 코딩테스트 보라고 하면 떨어질것같다..

갓디버거..

 

import java.util.*;
import java.util.regex.Pattern;

class Solution {
    public int solution(String str1, String str2) {
        int answer = assertValue(str1, str2);
        return answer;
    }
    
    private static int assertValue(String str1, String str2)
    {
        ArrayList<String> arr1 = convertArray(str1.toLowerCase());
        ArrayList<String> arr2 = convertArray(str2.toLowerCase());

        Set<String> set = new HashSet<>();
        set.addAll(arr1);
        set.addAll(arr2);

        HashMap<String, Integer> map1 = stringSetMap(arr1);
        HashMap<String, Integer> map2 = stringSetMap(arr2);

        int union = 0;
        int intersection = 0;
        Iterator<String> iter = set.iterator();
        while (iter.hasNext())
        {
            String key = iter.next();

            int max = Math.max(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0));
            int min = Math.min(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0));

            for (int j = 0; j < max; j++)
            {
                union++;
            }
            for (int j = 0; j < min; j++)
            {
                intersection++;
            }
        }

        float result = (float) intersection / (float) union;
        return (union == 0) ? 65536 : (int)(result * 65536);
    }

    private static ArrayList convertArray(String str)
    {
        ArrayList<String> result = new ArrayList<>();

        for (int i = 0; i<str.length()-1; i++)
        {
            String element = String.valueOf(str.charAt(i)) + str.charAt(i + 1);
            if (isEnglish(element))
            {
                result.add(element);
            }
        }
        return result;
    }

    private static HashMap<String, Integer> stringSetMap(ArrayList<String> list)
    {
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i< list.size(); i++)
        {
            String key = list.get(i);
            if (map.get(key) == null)
            {
                map.put(key, 1);
            } else {
                int count = map.get(key);
                map.put(key, ++count);
            }
        }
        return map;
    }

    private static boolean isEnglish(String str)
    {
        return Pattern.matches("^[a-zA-Z]*$", str) && !str.contains(" ");
    }
}

 

반응형

'CS > Algorithm' 카테고리의 다른 글

k 번째 수  (0) 2021.05.03
완주하지 못한 선수  (0) 2021.04.30
크레인 인형뽑기 게임  (0) 2021.04.29
삽입, 선택, 버블 정렬  (0) 2021.04.15
탐색 알고리즘 (DFS)  (0) 2020.12.22