https://programmers.co.kr/learn/courses/30/lessons/17677
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = J(str1.toUpperCase(), str2.toUpperCase());
return answer;
}
int J(String str1, String str2) {
Map<String, Integer> hm1 = new HashMap<>();
Map<String, Integer> hm2= new HashMap<>();
int intersection = 0;
int sum = 0;
initHashMap(hm1, str1);
initHashMap(hm2, str2);
for(String key : hm1.keySet()){
if(hm2.containsKey(key)){
intersection += Math.min(hm1.get(key), hm2.get(key));
}
sum += hm1.get(key);
}
for(String key : hm2.keySet()){
sum += hm2.get(key);
}
sum -= intersection;
if(sum == 0){
return 65536;
}
return intersection*65536/sum;
}
void initHashMap(Map<String, Integer> hm, String str){
for(int i=0; i<str.length()-1; i++){
if(!(isAlphabet(str.charAt(i)) && isAlphabet(str.charAt(i+1)))){
continue;
}
String s = str.charAt(i) + "" + str.charAt(i+1);
if(!hm.containsKey(s)){
hm.put(s, 1);
continue;
}
hm.put(s, hm.get(s)+1);
}
}
boolean isAlphabet(char c) {
if(c >= 'A' && c<= 'Z'){
return true;
}
return false;
}
}
str1 str2 answer
FRANCE | french | 16384 |
위의 경우 두 글자씩 끊어 해쉬맵에 저장했습니다.
hm1 = {FR, AN, CE}
hm2 = {fr, en, ce}
모두 저장한 후에
교집합과 합집합의 경우 해쉬맵을 이용해서 구하였는데,
교집합은 해쉬맵 hm1을 순회하여 해당 key가 hm2에도 있다면 교집합이므로 intersection에 hm1, hm2 둘 중 최솟값을 더하여 줍니다.
합집합은 해쉬맵 hm1과 hm2를 순회하면서 해당 key의 값을 sum에 모두 더합니다.
그 다음, 중복되는 값 intersection이 생기므로 sum -= intersection으로 처리했습니다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 괄호 변환 - java (0) | 2021.09.23 |
---|---|
[프로그래머스] 단체사진 찍기 - java (0) | 2021.09.23 |
[프로그래머스] 카카오프렌즈 컬러링 북 - java (0) | 2021.09.22 |
[프로그래머스] 문자열 압축 - java (0) | 2021.09.22 |
[카카오 블라인드 2018] [1차] 캐시 - java (0) | 2021.09.16 |