하루에 한 문제
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 뉴스 클러스터링 -Java 본문
알고리즘/프로그래머스 lv2 다시풀기
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 뉴스 클러스터링 -Java
dkwjdi 2021. 3. 14. 23:41https://programmers.co.kr/learn/courses/30/lessons/17677
import java.util.HashMap;
class Solution {
public int solution(String str1, String str2) {
float answer = 0;
//둘다 대문자로 변환
str1=str1.toUpperCase();
str2=str2.toUpperCase();
if(str1.contentEquals(str2)) return 65536;
HashMap<String, Integer> hm1= new HashMap<>();
HashMap<String, Integer> hm2= new HashMap<>();
slice(hm1, str1);
slice(hm2, str2);
float interSection=CalIntersection(hm1,hm2); //교집
float union=calUnion(hm1,hm2)-interSection; //합집
answer=interSection/union;
return (int)(answer*65536);
}
private float calUnion(HashMap<String, Integer> hm1, HashMap<String, Integer> hm2) {
int sum=0;
for(String s: hm1.keySet()) {
sum+=hm1.get(s);
}
for(String s: hm2.keySet()) {
sum+=hm2.get(s);
}
return sum;
}
private int CalIntersection(HashMap<String, Integer> hm1, HashMap<String, Integer> hm2) {
int sum=0;
for(String str : hm1.keySet()) {
if(hm2.containsKey(str)) { //만약 hm2에도 존재한다면
sum+=Math.min(hm1.get(str), hm2.get(str));
}
}
return sum;
}
private void slice(HashMap<String, Integer> hm, String str) {
for(int i=0; i<str.length()-1; i++) {
char ch[]= {str.charAt(i), str.charAt(i+1)};
if(isAlphabet(ch[0]) && isAlphabet(ch[1])) {
String s=String.valueOf(ch);
if(hm.containsKey(s)) hm.put(s, hm.get(s)+1); //이미 있으면 +1
else hm.put(s, 1); //없다면 1넣어서 삽입
}
}
// TODO Auto-generated method stub
}
private boolean isAlphabet(char ch) {
if(ch>=65 && ch<=90) return true;
return false;
}
}
소요시간 : 35분
교집합 , 합집합을 구하는 방법은
HashMap에 두글자씩 잘라서 넣습니다. 이 과정에서 공통되는 부분이 있다면 Value값을 1증가시켜 줍니다.
aaaa -> aa aa aa aa -> 'aa'가 4개가 나옵니다. 그렇다면 <'aa', 4> 이런식으로 저장을 해줍니다.
그리고 교집합을 구하기 위해서 hm1을 순회하면서 만약 hm2에 같은게 있다면 Math.min으로 작은것을 찾아서 더해줍니다.
합집합을 구하기 위해서는 hm1, hm2를 순회하면서 모든 Value값을 더합니다. 그리고 교집합값을 빼줍니다.
로직을 살펴보면
1. 모든 문자를 대문자로 바꿔준다. (이때 str1과 str2가 같다면 바로 65536을 return해준다)
2. hm1, hm2,에 각각 str1, str2를 잘라서 넣어준다.
3. 교집합, 합집합을 구한다.
4. 교집합/합집합 * 65536 을 반환한다.
끝~
'알고리즘 > 프로그래머스 lv2 다시풀기' 카테고리의 다른 글
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 방금그곡 -Java (0) | 2021.03.16 |
---|---|
[프로그래머스-lv2 2019 KAKAO BLIND RECRUITMENT] 오픈채팅방 -Java (1) | 2021.03.16 |
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 캐시 -Java (0) | 2021.03.15 |
[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 프렌즈 4블록 -Java (0) | 2021.03.15 |
[프로그래머스-lv2 2017 팁스타운] 예상 대진표 -Java (0) | 2021.03.14 |
Comments