알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 뉴스 클러스터링

HRuler 2020. 11. 29. 18:52

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17677?language=java

 

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

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

programmers.co.kr

2. 나의 풀이

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();
        //System.out.println("str1 : " + str1 + ", str2 : " + str2);
        ArrayList <String> str1_arr = new ArrayList<>();
        ArrayList <String> str2_arr = new ArrayList<>();
        for(int i = 0; i < str1.length() - 1; i = i + 1) {
        	if(str1.charAt(i) < 65 || str1.charAt(i) > 90) {
        		continue;
        	}
        	if(str1.charAt(i + 1) < 65 || str1.charAt(i + 1) > 90) {
        		continue;
        	}
        	str1_arr.add(str1.substring(i, i + 2));
        }
        for(int i = 0; i < str2.length() - 1; i = i + 1) {
        	if(str2.charAt(i) < 65 || str2.charAt(i) > 90) {
        		continue;
        	}
        	if(str2.charAt(i + 1) < 65 || str2.charAt(i + 1) > 90) {
        		continue;
        	}
        	str2_arr.add(str2.substring(i, i + 2));
        }
        //System.out.println("str1_arr : " + str1_arr);
        //System.out.println("str2_arr : " + str2_arr);
        if(str1_arr.size() == 0 && str2_arr.size() == 0) {
        	return 65536;
        }
        boolean [] str1_visited = new boolean[str1_arr.size()];
        boolean [] str2_visited = new boolean[str2_arr.size()];
        int gyo = 0;
        for(int i = 0; i < str1_arr.size(); i = i + 1) {
        	for(int j = 0; j < str2_arr.size(); j = j + 1) {
        		if(str2_visited[j] == true) {
        			continue;
        		}
        		if(str1_arr.get(i).equals(str2_arr.get(j))) {
        			str2_visited[j] = true;
        			gyo++;
        			break;
        		}
        	}
        }
        
        int hab = str1_arr.size() + str2_arr.size() - gyo;
        //System.out.println("gyo : " + gyo + ", hab : " + hab);
        answer = (int)(((double)gyo / hab) * 65536);
        return answer;
    }
}

3. 다른 사람 풀이

import java.util.ArrayList;
import java.util.List;

class Solution {
  public int solution(String str1, String str2) {
        List<String> set1 = extractValidElements(str1);
        List<String> set2 = extractValidElements(str2);

        if (set1.isEmpty() && set2.isEmpty()) {
            return 65536;
        }

        int intersectionSize = 0;
        int unionSize = 0;

        while (!set1.isEmpty()) {
            String target = set1.get(0);
            int targetSizeOfSet1 = 0;
            int targetSizeOfSet2 = 0;
            while (set1.contains(target)) {
                set1.remove(target);
                targetSizeOfSet1++;
            }
            while (set2.contains(target)) {
                set2.remove(target);
                targetSizeOfSet2++;
            }
            if (targetSizeOfSet2 > 0) {
                intersectionSize += Math.min(targetSizeOfSet1, targetSizeOfSet2);
                unionSize += Math.max(targetSizeOfSet1, targetSizeOfSet2);
            } else {
                unionSize += targetSizeOfSet1;
            }
        }

        unionSize += set2.size();

        double j = (double) intersectionSize / unionSize;

        int answer = (int) (j * 65536);
        return answer;
    }

    private static List<String> extractValidElements(String str) {
        List<String> set = new ArrayList<>();
        for (int i = 0; i < str.length() - 1; i++) {
            String temp = str.substring(i, i + 2);
            if (!((temp.charAt(0) >= 'A' && temp.charAt(0) <= 'Z')
                    || (temp.charAt(0) >= 'a' && temp.charAt(0) <= 'z'))) {
                continue;
            }
            if (!((temp.charAt(1) >= 'A' && temp.charAt(1) <= 'Z')
                    || (temp.charAt(1) >= 'a' && temp.charAt(1) <= 'z'))) {
                continue;
            }
            set.add(temp.toUpperCase());
        }
        return set;
    }
}