https://programmers.co.kr/learn/courses/30/lessons/17677

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

카카오 블라인드 테스트에서 출제된 문제이고, Level 2 이다.

문자열 비교를 통해서 두 문자열 간 부분 문자열(2자, 영문자만 허용) 간 자카드 유사도를 계산하는 문제이다.

첫 문자열을 2개 문자로 쪼갠 기준으로 두번째 문자열을 첫 문자열과 비교해서 교집합, 합집합 개수를 계산하여 리턴하면 된다.

다만 유의할 것으로는, 합집합 개수가 하나도 없는 경우에도 divide by zero 예외가 발생할 수 있어서 이런 경우에는 65536 값을 리턴하면 된다.

 

예제 코드는 다음과 같다.

import java.util.*;
class Solution {
    final static int LIMIT = 65536;

    public static int solution(String str1, String str2) {
        Map<String, Integer> map = new HashMap<>();
        int str1Count = 0, str2Count = 0;
        int commonCount = 0;
        for (int i = 0; i < str1.length()-1; i++) {
            String subStr = str1.substring(i,i+2).toLowerCase(Locale.ROOT);
            if (subStr.charAt(0) >= 'a' && subStr.charAt(0) <= 'z' && subStr.charAt(1) >= 'a' && subStr.charAt(1) <= 'z') {
                map.put(subStr,map.getOrDefault(subStr,0)+1);
                str1Count++;
            }
        }
        for (int i = 0; i < str2.length()-1; i++) {
            String subStr = str2.substring(i,i+2).toLowerCase(Locale.ROOT);
            if (subStr.charAt(0) >= 'a' && subStr.charAt(0) <= 'z' && subStr.charAt(1) >= 'a' && subStr.charAt(1) <= 'z') {
                if (map.get(subStr) != null && map.get(subStr) > 0) {
                    map.put(subStr, map.get(subStr)-1);
                    commonCount++;
                }
                str2Count++;
            }
        }
        int sumCount = str1Count + str2Count - commonCount;
        if (sumCount == 0) return LIMIT;
        
        double answer = LIMIT * commonCount / sumCount;
        return (int) answer;
    }
}

+ Recent posts