programmers_[1차] 뉴스 클러스터링_java

2023. 4. 5. 23:02Algorithm/Programmers

728x90

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;
class Solution {
    private final double MUL_VAL = 65536;
    public int solution(String str1, String str2) {
        int answer = 0;
        
        str1 = refineString(str1); // 문자열 정제
        str2 = refineString(str2);
        
        Map<String, Integer> str1Map = makeSubSets(str1);
        Map<String, Integer> str2Map = makeSubSets(str2);
        
        double union = str1Map.get("cnt") + str2Map.get("cnt");
        double intersection = 0;  
        
        for (Map.Entry<String, Integer> entry : str1Map.entrySet()){
            if(entry.getKey() == "cnt") continue; // 개수는 넘어가기
            
            if(str2Map.containsKey(entry.getKey())){ // 같은 값을 가지고 있는 경우
                intersection += Math.min(entry.getValue(), str2Map.get(entry.getKey())); // 두 수중 적은 값 더하기
            }
        }
        
        union = union-intersection;
       
        if(union <= 0) { // 공집합 또는 같은 경우
            answer = 1 * (int)MUL_VAL;
        }else{ //소수점은 버림
            answer = (int)Math.floor((intersection / union) * MUL_VAL);
        }       
        
        
        return answer;
    }
    
    public String refineString(String str){
        str = str.toLowerCase(); // 소문자로 변경
        str = str.replaceAll("[^a-z]", " "); // a-z 가 아닌 문자에 대해 replace // 특수문자가 들어간 경우 제외해야기 때문에 " "로 변경
       
        return str;
    }
    
    public Map<String, Integer> makeSubSets(String str){
        Map<String, Integer> map = new HashMap<>();
        int strLength = str.length();
        int cnt = 0;
        for(int i = 0; i< strLength-1; i++){
            if(str.charAt(i) == ' ' || str.charAt(i+1) == ' ') continue; // 두 문자 중 특수문자가 포함된 경우
            String tmp = str.charAt(i) + "" + str.charAt(i+1);
            cnt++; // 해당집합의 개수 카운팅
            
            if(map.containsKey(tmp)){ // 이미 있는 경우
                map.put(tmp, map.get(tmp) + 1);
            }else{
                map.put(tmp, 1);
            }            
        }
        
        map.put("cnt", cnt); // 해당 집합 개수 추가
        return map;
    }

}

'Algorithm > Programmers' 카테고리의 다른 글

programmers_타겟 넘버_java  (0) 2023.04.06
programmers_타겟 넘버_java  (0) 2023.04.06
programmers_연속 부분 수열 합의 개수_java  (0) 2023.04.05
programmers_n^2 배열 자르기_java  (0) 2023.04.05
programmers_튜플_java  (0) 2023.04.04