본문 바로가기
알고리즘/알고리즘

[JAVA] 프로그래머스 : 뉴스 클러스터링

by 두둠칫 2022. 8. 5.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. Map.Entry, 정규식 이용

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


class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        
        HashMap<String, Integer> m1 = new HashMap<String, Integer>();
        HashMap<String, Integer> m2 = new HashMap<String, Integer>();
        
        for(int i=0; i<str1.length()-1; i++){
            String tmp = str1.substring(i,i+2).toLowerCase();
            if(!tmp.matches("^[a-zA-Z]*$"))
                continue;
            
            if(m1.containsKey(tmp)){
                m1.put(tmp, m1.get(tmp)+1);
            }
            else{
                m1.put(tmp, 1);
            }
        }
        for(int i=0; i<str2.length()-1; i++){
            String tmp = str2.substring(i,i+2).toLowerCase();
            if(!tmp.matches("^[a-zA-Z]*$"))
                continue;
            
            if(m2.containsKey(tmp)){
                m2.put(tmp, m2.get(tmp)+1);
            }
            else{
                m2.put(tmp, 1);
            }
        }
        
        int a=0, b=0; // 교집합, 합집합
        for(Map.Entry<String, Integer> m : m1.entrySet()){
            if(m2.containsKey(m.getKey())){
                a+=Math.min(m2.get(m.getKey()), m.getValue());
                b+=Math.max(m2.get(m.getKey()), m.getValue());
            }
            else{
                b+=m.getValue();
            }
        }
        
        for(Map.Entry<String, Integer> m : m2.entrySet()){
            if(!m1.containsKey(m.getKey())){
                b+=m.getValue();
            }
        }
        
        if(a==0&&b==0)
            answer = 65536;
        else{
            answer = (int)Math.floor((((double)a)/((double)b))*65536);
        }
        
        return answer;
    }
}

 

 

 

2. 다른풀이에서 stream을 너무 잘쓴 코드가 있어서 두고두고 볼라고... 문제되면 삭제

private Map<String, Long> group(String word) {
        return IntStream.range(0, word.length() - 1)
                .mapToObj(index -> word.substring(index, index + 2))
                .filter(text -> text.chars().allMatch(character -> Character.isAlphabetic((char) character)))
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    }

    private Integer getIntersection(Map<String, Long> words1, Map<String, Long> words2) {
        return words1.entrySet().stream()
                .filter(entry -> words2.containsKey(entry.getKey()))
                .map(entry -> Math.min(entry.getValue(), words2.get(entry.getKey())))
                .mapToInt(Long::intValue)
                .sum();
    }

    private Integer getUnion(Map<String, Long> words1, Map<String, Long> words2) {
        Map<String, Long> copiedWords = new HashMap<>(words2);
        words1.forEach((key, value) -> copiedWords.put(key, Math.max(value, words2.getOrDefault(key, 0L))));

        return copiedWords.values().stream()
                .mapToInt(Long::intValue)
                .sum();

    }