코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

풀이)

알고리즘)

  • strs배열에 문자열을 2글자씩 추출해낸다.(동시에 특수문자, 숫자, 공백을 제거한다)
  • strs 원소의 길이가 1보다 클 경우에만 map에 추가한다.(map1, map2)
  • 이 때, 문자열을 키 값으로 사용하고 동일한 키 값의 갯수만큼을 Value로 지정한다)
  • map1을 탐색하며 현재 키 값이 map2에도 존재한다면 
  • intersection에는 map1, map2의 value중 작은값을 union에는 큰 값을 더해준다.
  • 존재하지 않다면 union에 map1의 value값을 더해준다.
  • map2를 탐색하며 현재 키 값이 map1에 존재하지 않을 경우에만 union에 map2의 value값을 더해준다.


코드)

import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.HashMap;
import java.util.*;
import java.lang.Math;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        Map<String,Integer> map1 = new HashMap<String,Integer>();
        Map<String,Integer> map2 = new HashMap<String,Integer>();
        float union = 0;
        float intersection = 0;
        String match = "[^\uAC00-\uD7A3xfe0-9a-zA-Z\\s]"; //특수문자 제거준비

        String[] strs1 = new String[str1.length() - 1];
        String[] strs2 = new String[str2.length() - 1];
        for(int i = 0 ; i < str1.length() - 1;i++)
        {
            strs1[i] = str1.substring(i,i+2);
            strs1[i] = strs1[i].replaceAll(match, " "); //특수문자 제거
            strs1[i] = strs1[i].toUpperCase(); // 대문자 변환
            strs1[i] = strs1[i].replaceAll("[0-9]",""); // 숫자 제거
            strs1[i] = strs1[i].replaceAll(" ",""); // 공백 제거
                
        }
        for(String key : strs1)
        {
            if(key.length() > 1)
                map1.put(key, map1.getOrDefault(key,0) + 1);

        }
        System.out.println(map1);
        System.out.println();
        
        for(int i = 0 ; i < str2.length() - 1;i++)
        {
            strs2[i] = str2.substring(i,i+2);
            strs2[i] = strs2[i].replaceAll(match, " ");
            strs2[i] = strs2[i].toUpperCase();
            strs2[i] = strs2[i].replaceAll("[0-9]","");
            strs2[i] = strs2[i].replaceAll(" ","");
        }
        for(String key : strs2)
        {
            if(key.length() > 1)
                map2.put(key, map2.getOrDefault(key,0) + 1);
        }
        System.out.println(map2);
        
        for (Map.Entry entry : map1.entrySet()) {
            if(map2.containsKey(entry.getKey())) // 
            {
                intersection += Math.min(map2.get(entry.getKey()),(int)entry.getValue());
                union += Math.max(map2.get(entry.getKey()),(int)entry.getValue());
            }
            else
            {
                //intersection += map1.get(entry.getKey());
                union += map1.get(entry.getKey());
            }
 
        }
        for (Map.Entry entry : map2.entrySet()) {
            if(map1.containsKey(entry.getKey())) // 
            {
               continue;
            }
            else
            {
                //intersection += map2.get(entry.getKey());
                union += map2.get(entry.getKey());
            }
 
        }
        System.out.printf("intersection: %f union: %f",intersection,union);
        if(intersection == 0 && union == 0)
            answer = 65536;
        else   
            answer = (int)((intersection/union) * 65536);
        System.out.printf("answer %d",answer);
        return answer;
    }
}

'프로그래머스' 카테고리의 다른 글

다음 큰 숫자  (0) 2021.10.03
거리두기 확인  (0) 2021.10.03
기능개발  (0) 2021.09.27
124나라의 숫자  (0) 2021.09.27
행렬 테두리 회전하기  (0) 2021.09.20

+ Recent posts