코딩테스트/[PG] 문제 풀이

[프로그래머스] 2018 KAKAO - [1차] 뉴스 클러스터링

_JAEJAE_ 2021. 9. 5. 13:42

https://programmers.co.kr/learn/courses/30/lessons/17677

 

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

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

programmers.co.kr


[풀이 과정]

1. str1, str2에서 각각 2글자씩 잘라서 해당 문자열이 모두 알파벳으로만 되어있다면 소문자로 바꾼후 arr1, arr2에 넣는다.

 

2. arr1, arr2에 대해 Counter함수를 사용해서 각 요소별 개수를 value로 갖는 dict1, dict2를 만든다.

 

3. dict1, dict2의 key값들을 keys에 넣는다.

 

4. 교집합 개수를 구하기 위해 keys에 있는 key값들을 하나씩 확인하면서 dict1, dict2 둘 다에 포함된 key값 중에서 min값을 cnt1에 더해준다.

 

5. 합집합 개수를 구하기 위해 keys에 있는 key값들을 하나씩 확인하면서 dict1, dict2 둘 다에 포함된 key값이면 max값을, 둘 중 하나에 포함된 key값은 해당 value를 cnt2에 더해준다.

 

6. cnt2가 0이면 주어진 조건에 따라 유사도가 1이므로 65536를 반환한다.

 

7. cnt2가 0이 아니면 cnt1/cnt2 * 65536을 구한 뒤 int로 타입을 변형해서 return한다.

 

set타입은 합집합, 교집합 연산을 제공하기 때문에 CODE2처럼 |, &을 활용하면 더 간단하게 문제를 해결할 수 있다. 

 


[소스 코드]

<CODE1>

from collections import Counter

def solution(str1, str2):
    answer = 0
    arr1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
    arr2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
    
    dict1 = dict(Counter(arr1))
    dict2 = dict(Counter(arr2))
    
    keys = set()
    for key in dict1.keys(): keys.add(key)
    for key in dict2.keys(): keys.add(key)
        
    cnt1, cnt2 = 0, 0
    for key in keys:
        if key in dict1.keys() and key in dict2.keys():
            cnt1 += min(dict1[key], dict2[key])
        
    for key in keys:
        if key in dict1.keys() and key in dict2.keys():
            cnt2 += max(dict1[key], dict2[key])
        elif key not in dict1.keys():
            cnt2 += dict2[key]
        elif key not in dict2.keys():
            cnt2 += dict1[key]
    
    if cnt2 == 0: answer = 65536
    else: answer = int((cnt1/cnt2)*65536)
    return answer

<CODE2>

def solution(str1, str2):
    arr1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
    arr2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
    
    i_arr = set(arr1) & set(arr2)
    u_arr = set(arr1) | set(arr2)
    
    if len(u_arr) == 0: return 65536
    
    i_cnt = sum([min(arr1.count(i), arr2.count(i)) for i in i_arr])
    u_cnt = sum([max(arr1.count(u), arr2.count(u)) for u in u_arr])
    return int((i_cnt/u_cnt)*65536)