[Programmers/프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 뉴스 클러스터링 - Python/파이썬 [해설/풀이]

SihoonCho·2022년 9월 22일
0
post-thumbnail
[Programmers/프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차 코딩테스트]
  1. [Lv. 1] 비밀 지도
  2. [Lv. 1] 다트 게임
  3. [Lv. 2] 캐시
  4. [Lv. 3] 셔틀버스
  5. [Lv. 2] 뉴스 클러스터링
  6. [Lv. 2] 프렌즈4블록
  7. [Lv. 3] 추석 트래픽

📌 문제



📝 입력 형식


💻 출력 형식


📖 입출력 예제


📌 풀이


from collections import Counter

def jaccard(list_a, list_b):
    # 다중집합의 교집합, 합집합 연산을 위한 Counter 변환
    counter_a, counter_b = Counter(list_a), Counter(list_b)
    inter = list((counter_a & counter_b).elements())    # 교집합
    union = list((counter_a | counter_b).elements())    # 합집합

    # 유사도 = 교집합크기 / 합집합크기, 분모가 0인 경우 유사도 1
    return len(inter) / len(union) if len(union) > 0 else 1

def solution(str1, str2):
    # set 대신 다중집합을 위한 list 생성
    list_a, list_b = list(), list()             # 다중집합 A, B
    str1, str2 = str1.lower(), str2.lower()     # 대소문자 소문자로 통일

    # str1에 대해 2글자씩을 원소로 하는 다중집합A 생성
    for i in range(len(str1) - 1):                      # 2글자씩 끊어야 하므로 len - 1
        if str1[i].isalpha() and str1[i + 1].isalpha(): # 특수문자 및 숫자 제외
            list_a.append(str1[i] + str1[i + 1])        # 2글자 원소 추가
            
    # str1에 대해 2글자씩을 원소로 하는 다중집합B 생성
    for i in range(len(str2) - 1):                      # 2글자씩 끊어야 하므로 len - 1
        if str2[i].isalpha() and str2[i + 1].isalpha(): # 특수문자 및 숫자 제외
            list_b.append(str2[i] + str2[i + 1])        # 2글자 원소 추가

    # 65536 곱한 후 소수점 아래를 버리고 정수부만 출력
    return int(jaccard(list_a, list_b) * 65536)
profile
꾸준히 노력하는 개발자

0개의 댓글