🖇️ 문제 링크
코딩테스트 연습 - [1차] 뉴스 클러스터링
여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다. 개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 "카카오 신입 개발자 공채" 관련 기사를 검색해보았다.


📝 문제 분석
서로의 집합에 원소가 있는지 확인하는 연산을 해야하고, 중복되는 원소가 있을 수 있기때문에 자바에는 멀티셋이 없으므로 <String, Cnt> 형태의 맵을 사용합니다.
다중 집합 A의 글자쌍들을 <글자쌍, 개수>형태로 맵에 저장합니다.
이어서, 다중 집합 B의 글자쌍들을 순회하며 맵에 저장되어 있는 글자쌍이라면 교집합이므로 카운트합니다.
모든 글자쌍이 교집합을 이뤘다면 맵에서 삭제시켜줍니다.
⌨️ 코드
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
// 대소문자 무시, 중복 가능, 영어만 가능
Map<String, Integer> hm = new HashMap<>();
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
// 문자쌍 뽑아내기
List<String> list = new ArrayList<>();
for(int i = 0; i < str1.length() - 1; i++) {
if(!Character.isAlphabetic(str1.charAt(i)) || !Character.isAlphabetic(str1.charAt(i + 1)))
continue;
hm.put(str1.substring(i, i + 2), hm.getOrDefault(str1.substring(i, i + 2), 0) + 1);
}
int inter = 0, union = 0;
for(int i = 0; i < str2.length() - 1; i++) {
if(!Character.isAlphabetic(str2.charAt(i)) || !Character.isAlphabetic(str2.charAt(i + 1)))
continue;
String str = str2.substring(i, i + 2);
if(hm.containsKey(str)) {
int cnt = hm.get(str);
if(cnt == 1)
hm.remove(str);
else
hm.put(str, cnt - 1);
inter++;
}
union++;
}
// 맵에 남아있는 원소 추가
for(int value : hm.values())
union += value;
if(union + inter == 0)
return 65536;
else
return (int)((inter / (double)union) * 65536);
}
}
Uploaded by Notion2Tistory v1.1.0