본문 바로가기

⏳ 알고리즘/python 알고리즘 문제 풀이

프로그래머스 - [1차] 뉴스 클러스터링(카카오 2018 블라인드 채용)

문제

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

 

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

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

programmers.co.kr

 

코드

def solution(str1, str2):
    # str1,str2 문자만 2글자씩 뽑기
    arr_str1, arr_str2 = [], []
    for i in range(len(list(str1))-1):
        if str1[i:i+2].isalpha():  
            arr_str1.append(str1[i:i+2].lower())
        
    for i in range(len(list(str2))-1):
        if str2[i:i+2].isalpha():  
            arr_str2.append(str2[i:i+2].lower())
    
    # 합집합, 교집합의 개수 구하기
    intersection = 0
    for i in arr_str1:         
        if i in arr_str2:    
            intersection += 1
    union = len(arr_str1 + arr_str2) - intersection
    
    # 유사도 값 구하기
    if union == 0:
        return 65536 
    else:
        return int(intersection/union*65536)

 

def solution(str1, str2):
    # str1,str2 문자만 2글자씩 뽑기
    arr_str1, arr_str2 = [], []
    for i in range(len(list(str1))-1):
        if str1[i:i+2].isalpha():  
            arr_str1.append(str1[i:i+2].lower())
        
    for i in range(len(list(str2))-1):
        if str2[i:i+2].isalpha():  
            arr_str2.append(str2[i:i+2].lower())
    
    # 교집합, 합집합 개수 구하기
    intersection = 0
    for i in arr_str2:         
        if i in arr_str1:    
            intersection += 1
            arr_str1.remove(i)
    union = len(arr_str1 + arr_str2)

    # 유사도 값 구하기
    if union == 0:
        return 65536 
    else:
        return int(intersection/union*65536)

union = arr_str1 + arr_str2 - intersection 이므로

arr_str1에서 intersection인 부분을 지워 저장 -> union = arr_str1 + arr_str2

intersection = 0
for i in arr_str2:         
  if i in arr_str1:    
    intersection += 1
    arr_str1.remove(i)
    
위 코드는 아래와 같이도 바꿔줄 수 있다.

intersection = len([arr_str1.remove(x) for x in arr_str2 if x in arr_str1])