akjfal

[Programmers] [1차] 뉴스 클러스터링 본문

알고리즘/programmers

[Programmers] [1차] 뉴스 클러스터링

akjfal 2021. 6. 17. 15:43
// 1.a,b를 2단어 씩으로 쪼개며 저장 - "[a-z][a-z]"에 일치하지 않는 것을 제외
// 2. union에 b를 통째로 옮김
// 3. b와 a를 비교해 key값이 일치하는 경우
// 3.1 intersection에 작은 값을 저장
// 3.2 union에 큰 값을 저장
// 4. 일치하지 않을 경우 union에만 저장
// 5. iterator를 통해 intersection과 union의 value 합 구하기

import java.util.HashMap;
import java.util.Iterator;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        HashMap<String, Integer> a = new HashMap<>();
        HashMap<String, Integer> b = new HashMap<>();
        for(int i = 0; i < str1.length()-1; i++){
            String str1Ele = str1.substring(i, i+2);
            if(str1Ele.matches("[a-z][a-z]")){
                if(a.containsKey(str1Ele)){
                    a.put(str1Ele, a.get(str1Ele)+1);
                }else{
                    a.put(str1Ele, 1);
                }   
            }
        }
        for(int i = 0; i < str2.length()-1; i++){
            String str2Ele = str2.substring(i, i+2);
            if(str2Ele.matches("[a-z][a-z]")){
                if(b.containsKey(str2Ele)){
                    b.put(str2Ele, b.get(str2Ele)+1);
                }else{
                    b.put(str2Ele, 1);
                }
            }
        }
        HashMap<String, Integer> intersection = new HashMap<>();
        HashMap<String, Integer> union = new HashMap<String, Integer>(b);
        Iterator<String> itr1 = a.keySet().iterator();
        while(itr1.hasNext()){
            String s1 = itr1.next();
            if(b.containsKey(s1)){
                intersection.put(s1, Math.min(a.get(s1), b.get(s1)));
                union.put(s1, Math.max(a.get(s1), b.get(s1)));       
            }else{
                union.put(s1, a.get(s1));
            }
        }
        int I = 0;
        int U = 0;
        Iterator<String> itrI = intersection.keySet().iterator();
        while(itrI.hasNext()){
            I += intersection.get(itrI.next());
        }
        Iterator<String> itrU = union.keySet().iterator();
        while(itrU.hasNext()){
            U += union.get(itrU.next());
        }
        if(U == 0){
            answer = 65536;
        }else{
            answer = I*65536/U;   
        }
        return answer;
    }
}

어렵지 않았다. 카카오 1번정도 되는 것 같다.

'알고리즘 > programmers' 카테고리의 다른 글

[Programmers] 순위 검색  (0) 2021.06.17
[Programmers] 행렬 테두리 회전하기  (0) 2021.06.17
[Programmers] 튜플  (0) 2021.06.17
[Programmers] 수식 최대화  (0) 2021.06.17
[Programmers] 괄호 회전하기  (0) 2021.06.17
Comments