[1차] 뉴스 클러스터링

문제


문제 풀이

2개의 문자열의 2개씩 잘랐을 때 나오는 문자들을 하나씩 카운팅하면서 최종적으로 합집합과 교집합에서 중복되는 수를 포함한 총 수들을 가지고 나눠야 하는 문제이다. 

 

문제를 풀면서 가장 헷갈린 부분은 구해진 문자에서 어떻게 개수를 체크해서 처리하는가에 대한 문제였고 해당 문제는 map 자료구조로 처리하였다. 


나의 답안

public static int solution(String str1, String str2) {
    str1 = str1.toLowerCase();
    str2 = str2.toLowerCase();
    Map<String, Integer> map1 = new HashMap<>(); //str1
    Map<String, Integer> map2 = new HashMap<>(); //str2
    Set<String> set = new HashSet<>(); // 합집합용
    int ans = 0, total = 0;

    for(int i = 0; i < str1.length() - 1 ; i ++){
        String temp = str1.substring(i, i + 2);
        if(Character.isAlphabetic(temp.charAt(0)) //알파벳이면 추가
                && Character.isAlphabetic(temp.charAt(1))){
            map1.put(temp, map1.getOrDefault(temp, 0) + 1);
            set.add(temp);
        }
    }

    for(int i = 0; i < str2.length() - 1 ; i ++){
        String temp = str2.substring(i, i + 2);
        if(Character.isAlphabetic(temp.charAt(0)) //알파벳이면 추가
                && Character.isAlphabetic(temp.charAt(1))){
            map2.put(temp, map2.getOrDefault(temp, 0) + 1);
            set.add(temp);
        }
    }

    for(String s : set) //합집합 구하기
        total += Math.max(map1.getOrDefault(s, 0) , map2.getOrDefault(s, 0));

    for(String s : map2.keySet()) //교집합 구하기
        if(map1.containsKey(s))
            ans += Math.min(map1.get(s), map2.get(s));


    if(total == 0) return 65536;
    return ans * 65536 / total;
}

'Programmers 문제풀이 > Lv.2' 카테고리의 다른 글

전화번호 목록  (0) 2023.04.03
타겟 넘버  (0) 2023.04.03
연속 부분 수열 합의 개수  (0) 2023.04.03
n^2 배열 자르기  (0) 2023.04.02
튜플  (0) 2023.04.02