프로그래머스 | 뉴스 클러스터링 (Java)

mul·2023년 2월 25일
0

코딩테스트연습

목록 보기
29/56

🔒 문제

프로그래머스 Lv.2 2018 KAKO BLIND RECRUITMENT [1차] 뉴스 클러스터링

🔑 해결

문자열 2개가 주어졌을 때, 이를 두 글자씩 끊어서 다중집합을 만든다. 이 다중집합을 응용하여 두 문자열 사이의 자카드 유사도를 구한 후 65536을 곱한 값을 return하는 solution함수를 작성하는 문제이다.

대소문자 차이를 무시하기 때문에 문자열을 비교할 때는 equalsIgnoreCase함수를 사용했다. 그 다음, 문자열을 두 글자씩 끊어서 ArrayList에 담아 반환하는 str_to_two함수를 만들어서 주어진 문자열을 다중집합의 원소로 만든다. 만들어진 원소를 비교해서 같다면 해당 원소를 교집합 원소를 담는 ArrayList에 추가하고, 원래 있던 ArrayList에서 삭제하였다. 이 과정을 통해 s1, s2 ArrayList에는 교집합 원소를 제외한 원소만 남겼다.

🔓 코드

import java.util.ArrayList;
class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        
        if (str1.equalsIgnoreCase(str2))
        	return 65536;
        
        ArrayList<String> s1 = str_to_two(str1);
        ArrayList<String> s2 = str_to_two(str2);
        
        ArrayList<String> intersection = new ArrayList<>();
        for (int i = 0; i < s1.size(); i++) {
			for (int j = 0; j < s2.size(); j++) {
				if (s1.get(i).equalsIgnoreCase(s2.get(j))) {
					intersection.add(s1.get(i));
					s2.remove(j);
					break;
				}
			}
		}
        for (int i = 0; i < intersection.size(); i++) {
			s1.remove(intersection.get(i));
		}
        
        // 유사도 계산
        int sum = s1.size() + s2.size() + intersection.size();
        double similarity = intersection.size() / (double)sum;
        
        answer = (int)(similarity * 65536);
        
        return answer;
    }
    
    private ArrayList<String> str_to_two(String str) {
    	ArrayList<String> list = new ArrayList<>();
    	for (int i = 0; i < str.length()-1; i++) {
			String tw = str.substring(i, i + 2);
			char first = tw.charAt(0);
			char second = tw.charAt(1);
			if (first > 64 && first < 91 || first > 96 && first < 123) {
				if (second > 64 && second < 91 || second > 96 && second < 123) {
					list.add(tw); // A(65) - Z(90), a(97) - z(122) 사이의 알파벳으로 이루어진 문자만 list에 add
				}
			}
		}
    	return list;
    }
}

0개의 댓글