Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

[level 2] [1차] 뉴스 클러스터링 - 17677 본문

프로그래머스

[level 2] [1차] 뉴스 클러스터링 - 17677

csct3434 2024. 2. 28. 19:59

문제 링크

 

프로그래머스

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

programmers.co.kr

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

class Solution {

    public int solution(String str1, String str2) {
       HashMap<String, Integer> tokenMap1 = new HashMap<>();
       HashMap<String, Integer> tokenMap2 = new HashMap<>();

       extractTokens(str1.toLowerCase(), tokenMap1);
       extractTokens(str2.toLowerCase(), tokenMap2);

       if (tokenMap1.size() + tokenMap2.size() == 0) {
          return 65536;
       }

       int intersectionSize = calcIntersectionSize(tokenMap1, tokenMap2);
       int unionSize = calcUnionSize(tokenMap1, tokenMap2);
       return 65536 * intersectionSize / unionSize;
    }

    public void extractTokens(String str, Map<String, Integer> tokenMap) {
       for (int i = 0; i < str.length() - 1; i++) {
          if (Character.isAlphabetic(str.charAt(i)) && Character.isAlphabetic(str.charAt(i + 1))) {
             String token = str.substring(i, i + 2);
             Integer count = tokenMap.getOrDefault(token, 0);
             tokenMap.put(token, count + 1);
          }
       }
    }

    public int calcIntersectionSize(Map<String, Integer> tokenMap1, Map<String, Integer> tokenMap2) {
       int size = 0;

       for (String key : tokenMap1.keySet()) {
          if (tokenMap2.containsKey(key)) {
             size += Math.min(tokenMap1.get(key), tokenMap2.get(key));
          }
       }

       return size;
    }

    public int calcUnionSize(Map<String, Integer> map1, Map<String, Integer> map2) {
       int size = 0;
       
       HashSet<String> allKeys = new HashSet<>();
       allKeys.addAll(map1.keySet());
       allKeys.addAll(map2.keySet());

       for (String key : allKeys) {
          size += Math.max(map1.getOrDefault(key, 0), map2.getOrDefault(key, 0));
       }
       
       return size;
    }
}