[프로그래머스 / Level2] [1차] 뉴스 클러스터링 (Java)

wannabeking·2022년 7월 24일
0

코딩테스트

목록 보기
64/155

문제 보기



사용한 것

  • 자카드 유사도를 구하기 위한 HashMap


풀이 방법

  • str1, str2를 소문자로 만들고 두 글자씩 끊어 map1, map2에 1 저장
    • 중복된 문자면 value 1 증가
    • 공백, 숫자, 기호 등이 포함되면 추가 X
  • map3에 교집합 넣어줌
  • map4에 합집합 넣어줌
  • map3, map4에 저장된 모든 value를 더하여 답을 구해 리턴
    • 교집합, 합집합이 둘다 0인 경우 65536 반환


코드

class Solution {
    public int solution(String str1, String str2) {
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        Map<String, Integer> map3 = new HashMap<>();
        Map<String, Integer> map4 = new HashMap<>();

        // A 구하기
        for(int i = 0; i < str1.length() - 1; i++) {
            char c1 = str1.charAt(i);
            char c2 = str1.charAt(i + 1);
            if(c1 < 97 || c1 > 122 || c2 < 97 || c2 > 122) {
                continue;
            }

            String str = String.valueOf(c1) + c2;

            map1.put(str, map1.getOrDefault(str, 0) + 1);
        }

        // B 구하기
        for(int i = 0; i < str2.length() - 1; i++) {
            char c1 = str2.charAt(i);
            char c2 = str2.charAt(i + 1);
            if(c1 < 97 || c1 > 122 || c2 < 97 || c2 > 122) {
                continue;
            }

            String str = String.valueOf(c1) + c2;

            map2.put(str, map2.getOrDefault(str, 0) + 1);
        }

        // 교집합 구하기
        for(String key : map1.keySet()) {
            int value1 = map1.get(key);
            int value2 = 0;
            if(map2.containsKey(key)) {
                value2 = map2.get(key);
            }

            if(value2 > 0) {
                map3.put(key, Math.min(value1, value2));
            }
        }

        // 합집합 구하기
        for(String key : map1.keySet()) {
            int value = map1.get(key);
            map4.put(key, value);
        }

        for(String key : map2.keySet()) {
            int value = map2.get(key);
            if(map4.containsKey(key)) {
                map4.put(key, Math.max(value, map4.get(key)));
            } else {
                map4.put(key, value);
            }
        }

        int andNum = 0;
        for(String key : map3.keySet()) {
            andNum += map3.get(key);
        }
        int orNum = 0;
        for(String key : map4.keySet()) {
            orNum += map4.get(key);
        }

        return andNum == 0 && orNum == 0 ? 65536 : (int) (((double) andNum / orNum) * 65536);
    }
}


profile
내일은 개발왕 😎

0개의 댓글