(자바) (프로그래머 레벨 2) 뉴스 클러스터링

프로그램 제작자

코드 중심 개발자를 고용하십시오. 스택 기반 위치 일치. 프로그래머를 위한 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.

프로그래머.co.kr

내 솔루션

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        // 2글자씩 자르기
        Map<String, Integer> map1 = getSubstringMap(str1.toLowerCase());
        Map<String, Integer> map2 = getSubstringMap(str2.toLowerCase());
        
        // map1, map2의 키값을 각각 순회하면서 map3 map4를 만든다.

이때 map3는 min값으로, map4는 max값으로 만든다.

Map<String, Integer> minMap = getMinMap(map1, map2); Map<String, Integer> maxMap = getMaxMap(map1, map2); // Math.floor((minMap의 밸류의 합 / maxMap의 밸류의 합 ) * 65536 ) int minTotal = getTotalValueOfMap(minMap); int maxTotal = getTotalValueOfMap(maxMap); // 공집합 예외처리 if (minTotal == 0 && maxTotal == 0) return 65536; return (minTotal * 65536) / maxTotal; } private int getTotalValueOfMap(Map<String, Integer> map) { int total = 0; for (Map.Entry<String, Integer> entry: map.entrySet()) { String key = entry.getKey(); int value = map.get(key); total += value; } return total; } private Map<String, Integer> getMaxMap(Map<String, Integer> map1, Map<String, Integer> map2) { Map<String, Integer> map = new HashMap<>(); for (Map.Entry<String, Integer> entry: map1.entrySet()) { String key = entry.getKey(); int value = Math.max(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0)); if (value !
= 0) { map.put(key, value); } } for (Map.Entry<String, Integer> entry: map2.entrySet()) { String key = entry.getKey(); int value = Math.max(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0)); if (value !
= 0) { map.put(key, value); } } return map; } private Map<String, Integer> getMinMap(Map<String, Integer> map1, Map<String, Integer> map2) { Map<String, Integer> map = new HashMap<>(); for (Map.Entry<String, Integer> entry: map1.entrySet()) { String key = entry.getKey(); int value = Math.min(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0)); if (value !
= 0) { map.put(key, value); } } for (Map.Entry<String, Integer> entry: map2.entrySet()) { String key = entry.getKey(); int value = Math.min(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0)); if (value !
= 0) { map.put(key, value); } } return map; } private Map<String, Integer> getSubstringMap(String str){ Map<String, Integer> map = new HashMap<>(); char() chars = str.toCharArray(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length() - 1; i++) { if ('a' <= chars(i) && chars(i) <= 'z' && 'a' <= chars(i + 1) && chars(i + 1) <= 'z' ){ sb.append(chars(i)); sb.append(chars(i+1)); String key = sb.toString(); map.put(key, map.getOrDefault(key,0) + 1); sb.deleteCharAt(0); sb.deleteCharAt(0); } } return map; } }
  • 내 해결책은 맵을 사용하여 단어 수의 최소값과 최대값을 교집합 수로 계산하는 것입니다.

  • 아래 다른 분들의 솔루션을 찾아보니 ArrayList에 넣어두어서 포함 여부를 확인하고 Intersection List에 넣고, 포함 여부에 관계없이 Union List에 넣는 방법을 선택했습니다.

    코드가 더 간결해지고, 시간 복잡도가 더 좋은 코드인 것 같습니다.

다른 사람의 솔루션