[Python] 2018 KAKAO BLIND RECRUITMENT : [1차] 뉴스 클러스터링(Counter 함수)

송진영·2022년 6월 25일
0

프로그래머스-python

목록 보기
4/22

2018 KAKAO BLIND RECRUITMENT : [1차] 뉴스 클러스터링

문제 풀이

처음에 set을 이용하여 중복을 제거하여 문제를 풀었는데 그렇게 되면
3번 예제의 경우, str1 = ['AA', 'AA'], str2 = ['AA', 'AA', 'AA']가 나와(대문자로 통일)
교집합 = ['AA'], 합집합 = ['AA']가 나오는 문제가 발생한다.
그래서 파이썬 내장함수인 Counter 함수를 이용해 교집합과 합집합을 구하면,
교집합 = ['AA', 'AA'], 합집합 = ['AA', 'AA', 'AA'](다중집합을 허용하여 str2가 합집합이 된다.)이 되어 답을 구할 수 있다.

collections.Counter(a)

collections.Counter(a) : a에서 요소들의 개수를 세어, 딕셔너리 형태로 반환합니다. {문자 : 개수} 형태
Ex. 합집합
list1 | list2 => Counter({'HA': 2, 'AN': 1, 'ND': 1, 'DS': 1, 'SH': 1, 'AK': 1, 'KE': 1})
Ex. 교집합
list1 & list2 => Counter({'HA': 2, 'AN': 1, 'ND': 1, 'DS': 1, 'SH': 1, 'AK': 1, 'KE': 1})
Ex. Counter 값 불러오기
(list1 | list2).values() => dictvalues([2, 1, 1, 1, 1, 1, 1])
Ex. Counter 요소 불러오기
list(list1 & list2).elements() => ['HA', 'HA', 'AN', 'ND', 'DS', 'SH', 'AK', 'KE']
Ex. 합집합의 수
sum((list1 | list2).values()) => 8
Ex. 교집합의 수_
sum((list1 & list2).values()) => 8

from collections import Counter
def solution(str1, str2):
    answer = 0
    arr1 = [str1[i:i+2].upper() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
    arr2 = [str2[i:i+2].upper() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
    ## 공집합일 경우
    if len(arr1) == 0 and len(arr2) == 0:
        return 65536

    ## Counter 함수를 이용해 원소 count
    c1 = Counter(arr1)
    c2 = Counter(arr2)
  
    ## 합집합
    sum_set = sum((c1 | c2).values())
    ## 교집합
    inter_set = sum((c1 & c2).values()) 
    print(sum((c1 & c2).values()))
    print(list((c1 & c2).elements()))

    ## int를 이용해 소수점 자르고, 교집합 수 / 합집합 수 * 65536
    return int(inter_set / sum_set * 65536)
profile
못하는 건 없다. 단지 그만큼 노력을 안 할 뿐이다.

0개의 댓글