일단 시작해보는 블로그

[알고리즘] 카카오_뉴스 클러스터링 본문

CS/알고리즘 풀이

[알고리즘] 카카오_뉴스 클러스터링

Selina Park 2019. 8. 22. 13:45

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

 

코딩테스트 연습 - [1차] 뉴스 클러스터링 | 프로그래머스

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다. 개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 카카오 신입 개발자 공채 관련 기사를 검색해보았다. 카카오 첫 공채..'블라인드' 방식 채용 카카오, 합병 후 첫

programmers.co.kr

 

처음엔 왜 Queue를 가지고 풀려고 했었는지 모르겠다ㅠㅠ 큐 문제였을까 아니면 정규식을 이용해서 String클래스에 있는 matches메서드를 사용해서 영문자로만 되어있는걸 걸러내지 못했던 탓일까 처음에 많이 헷깔렸던 문제..!

 

덕분에 Queue, ArrayList, String클래스의 메서드 등에 대하여 정리하게 되었다.

 

처음 작성한 코드..

합계: 30.8 / 100.0

ㅠㅠ

import java.util.*;

class Solution {
   static List<String> arr_1 = new ArrayList<>();
    static List<String> arr_2 = new ArrayList<>();

    static void getArray(String str, int n){
        str = str.toLowerCase();
        char[] result = str.toCharArray();

        String tmp = "";

        int i=0;
        while(i<result.length){
            int c = (int)result[i];
            if(c >= 97 && c <= 122){
                if(tmp.length() == 0){
                    tmp += result[i++];
                }else if(tmp.length() == 2){
                    if(n == 1){
                        arr_1.add(tmp);
                    }
                    if(n == 2){
                        arr_2.add(tmp);
                    }
                    tmp = "";
                    continue;
                }else{
                    tmp += result[i];
                }
            }else {
                if(tmp.length() == 1){
                    tmp = "";
                    i++;
                }
            }
        }
    }

    //자카드 유사도
    static int news_answer(){
        int arbi = 0;
        int sum = 0;

        while(arr_1.size() > 0){
            if(arr_2.contains(arr_1.get(0))){
                arr_2.remove(arr_1.get(0));
                arr_1.remove(0);
                arbi += 1;
                sum += 1;
            }else {
                arr_1.remove(0);
                sum += 1;
            }
        }

        if(arr_2.size() > 0){
            sum += arr_2.size();
        }

        int an = (int)Math.floor((double)arbi/sum * 65536);

        return an;
    }
    
  public int solution(String str1, String str2) {
      //영문자 필터 후 넣기
        getArray(str1, 1);
        getArray(str2, 2);

        //자카드 유사도

        return news_answer();
  }
}

 

 

두번째 로직을 바꿨다.

합계: 100.0 / 100.0

 

import java.util.*;

class Solution {
  
    public static int getJarkad(String str1, String str2){

        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();

        //str1 영문자만 두글자 있으면 자르기
        String tmpStr = "";

        //set list1
        for(int i=0; i<str1.length()-1; i++){

            tmpStr = str1.substring(i, i+2).toUpperCase();

            if(tmpStr.matches("^[A-Z]+$")){
                list1.add(tmpStr);
            }
        }

        //set list2
        for(int i=0; i<str2.length()-1; i++){
            tmpStr = str2.substring(i, i+2).toUpperCase();

            if(tmpStr.matches("^[A-Z]+$")){
                list2.add(tmpStr);
            }
        }

        //set union list
        ArrayList<String> unionList = getUnionList(list1, list2);
        //set intersection list
        ArrayList<String> intersectionList = getIntersectionList(list1, list2);



        if(intersectionList.size() == unionList.size()) {
            return 65536;
        }
        else {
            return (int) ((double) intersectionList.size() / (double) unionList.size() * (double) 65536);

        }
    }

    private static ArrayList<String> getUnionList(ArrayList<String> list1, ArrayList<String> list2){
        list1 = (ArrayList<String>) list1.clone();
        list2 = (ArrayList<String>) list2.clone();

        ArrayList<String> unionList = new ArrayList<>();

        for(String str : list1){
            if(list2.contains(str)){
                list2.remove(str);
            }
            unionList.add(str);
        }

        unionList.addAll(list2);


        return unionList;
    }

    private static ArrayList<String> getIntersectionList(ArrayList<String> list1, ArrayList<String> list2){
        list1 = (ArrayList<String>) list1.clone();
        list2 = (ArrayList<String>) list2.clone();

        ArrayList<String> intersectionList = new ArrayList<>();

        for(String str : list1){
            if(list2.contains(str)){
                intersectionList.add(str);
                list2.remove(str);
            }
        }

        return intersectionList;
    }  
  
  public int solution(String str1, String str2) {
      int answer = getJarkad(str1, str2);

        return answer;
  }
}

 

 

 

Comments