코딩 테스트/프로그래머스

프로그래머스 - 뉴스 클러스터링 문제 (자바)

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

 

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

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

programmers.co.kr

문자열 두개를 소문자로 바꾸고 정규식을 이용해서 소문자 알파벳으로 이루어진 키만 map에 등록합니다.

첫번째 문자열의 map을 순회하면서 두번째 문자열에

key값에 포함되면 교집합 count + 1를 해주고 합집합에는 해당 키값의 value값을 더 작은 값으로 만들어줍니다.

포함되지 않으면 합집합에 추가 해줍니다.

이후 합집합 map을 순회하면서 개수를 카운트한 뒤 값을 구해줍니다.

 

주의할점으로 int값으로 처리했기때문에 2/8 같은 경우 0이 됩니다. 그래서 double을 사용하시거나 곱하는 값을 먼저 한뒤 나눠주거나 해야합니다.

import java.util.HashMap;
import java.util.Map;

class Solution {
    static final int MUL = 65536;
    public int solution(String str1, String str2) {
        Map<String, Integer> str1Map = new HashMap<>();
        Map<String, Integer> str2Map = new HashMap<>();

        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();

        for (int i = 0; i < str1.length() - 1; i++) {
            String key = "";
            key += str1.charAt(i);
            key += str1.charAt(i + 1);
            if(key.matches("^[a-z]*$")) {
                str1Map.put(key, str1Map.getOrDefault(key, 0) + 1);
            }
        }

        for (int i = 0; i < str2.length() - 1; i++) {
            String key = "";
            key += str2.charAt(i);
            key += str2.charAt(i + 1);
            if(key.matches("^[a-z]*$")) {
                str2Map.put(key, str2Map.getOrDefault(key, 0) + 1);
            }
        }

        int sub = 0;
        Map<String, Integer> sumMap = new HashMap<>(str2Map);
        for (String s : str1Map.keySet()) {
            if(str2Map.containsKey(s)) {
                sub += Math.min(str1Map.get(s), str2Map.get(s));
                sumMap.put(s, Math.max(str1Map.get(s), str2Map.get(s)));
            }else {
                sumMap.put(s, str1Map.get(s));
            }
        }

        int sum = 0;
        for (String s : sumMap.keySet()) {
            sum += sumMap.get(s);
        }

        if(sum == 0) {
            return MUL;
        }
        return sub * MUL / sum;
    }
}