프로그래머스 Lv2 뉴스 클러스터링 Java

Android Chen·2021년 12월 10일
0

문제설명

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

풀이방법

  • 먼저 특수문자, 숫자, 공백을 제거하고 남은 문자열 중 길이가 2인 substring을 구하기 위해 기존 주어진 문자열을 정규표현식으로 split하였다.
  • ^기호를 통해 여집합을 사용할 수 있으며 [^a-zA-Z]로 문자가 아닌 것들을 기준으로 문자열을 나누고 리스트에 저장한다.
  • 이후 길이가 2인 부분 문자열을 각 map에 저장하고 공통된 부분의 크기를 구한다.
  • 합집합 = A + B - (A and B) 이므로 (share)/(cnt-share) 라는 식을 도출하였고 결과에 65536을 곱하였다.

코드

import java.util.*;
import java.io.*;
class Solution {
    public int solution(String str1, String str2) {
        List<String> one_list = new ArrayList<>();
        List<String> two_list = new ArrayList<>();
        String[] sp1 = str1.split("[^a-zA-Z]");
        String[] sp2 = str2.split("[^a-zA-Z]");
        Map<String,Integer> map1 = new HashMap<>();
        Map<String,Integer> map2 = new HashMap<>();
        int cnt=0;
        for(String t : sp1){
            for(int i=0;i<t.length()-1;i++){
                String sub = t.toUpperCase().substring(i,i+2);
                map1.put(sub,map1.getOrDefault(sub,0)+1);
                cnt++;
            }
        }
        for(String t : sp2){
            for(int i=0;i<t.length()-1;i++){
                String sub = t.toUpperCase().substring(i,i+2);
                map2.put(sub,map2.getOrDefault(sub,0)+1);
                cnt++;
            }
        }
        int share =0;
        for(Map.Entry<String,Integer> entry : map1.entrySet()){
            if(map2.containsKey(entry.getKey())){
                share += Math.min(map2.get(entry.getKey()),map1.get(entry.getKey()));
            }
        }
        if(map2.size()==0){
            return 65536;
        }
        int answer = (share)*65536/(cnt-share);
        return answer;
    }
}
profile
https://github.com/Userz1-redd

0개의 댓글