Algorithm/Programmers
programmers_[1차] 뉴스 클러스터링_java
owoowo
2023. 4. 5. 23:02
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;
}
}