devFancy BE Developer

[Programmers] 17677. [1차] 뉴스 클러스터링

2023-02-11
devfancy

문제 링크

성능 요약

  • 메모리: 81.2 MB, 시간: 7.34 ms

구분

  • 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT

Answer Code1(2021.02.11)

import java.util.*;

class Solution {
    public int solution(String str1, String str2) {

        //[1]
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();

        ArrayList<String> intersection = new ArrayList<>();
        ArrayList<String> union = new ArrayList<>();

        double jaccard = 0;
        
        //[2]
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();

        //[3]
        for(int i = 0; i < str1.length()-1; i++) {
            char first = str1.charAt(i);
            char second = str1.charAt(i + 1);

            if((first >= 'a' && first <= 'z') && (second >= 'a' && second <= 'z')) {
                list1.add(first + "" + second);
            }
        }

        for(int i = 0; i < str2.length()-1; i++) {
            char first = str2.charAt(i);
            char second = str2.charAt(i + 1);

            if((first >= 'a' && first <= 'z') && (second >= 'a' && second <= 'z')) {
                list2.add(first + "" + second);
            }
        }
        
        for(String s : list1) {
            if(list2.remove(s)) {
                intersection.add(s);
            }
            union.add(s);
        }

        for(String s : list2) {
            union.add(s);
        }
        
        //[4]
        if(union.size() == 0) {
            jaccard = 1;
        } else {
            jaccard = (double)intersection.size() / (double)union.size();
        }
        
        //[5]
        return (int)(jaccard * 65536);
    }
}

문제 풀이

  • 문제 설명 요약 : 자카드 유사도를 구하는 문제인데, 자카드 유사도의 값은 교집합 / 합집합이다.

    • 대소문자를 구분하지 않는다.

    • 공집합일 경우에는 값을 1로 정의한다.

    • 기타 공백 or 숫자 or 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.

  • 풀이 순서

    • [1] 두 집합을 연결리스트로 생성한다. 그리고 교집합과 합집합을 담는 연결리스트를 생성한다.

    • [2] 두 문자열을 전부 소문자로 변환한다.

    • [3] 기타 공백 or 숫자 or 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.

      • list2.remove(s) : 해당 값이 있으면 제거하고 true을 반환하거나 해당 값이 없으면 false를 반환한다.
    • [4] 공집합일 경우에는 1 로 정의한다.

    • [5] 자카드 유사도를 구한다.(소수점이 나오도록 double형으로 변환하여 계산한다)

      • 마지막에 정수형으로 return 할 때 int형으로 변환하여 65536을 곱한다.

Review

  • 2018 KAKAO BLIND RECRUITMENT 1차 5번 문제였다. (난이도 : 중)

  • 문제 설명이 길다고 해서 겁먹지 말고, 집중해서 읽으면 쉽게 풀 수 있는 문제였다.

  • 조건이 많으면, 풀이 순서를 정리한 뒤에 하나씩 풀어나가는 연습을 꼭 하자.


Comments

Index