알고리즘 스터디 2021.07~

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

문제

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

 

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

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

programmers.co.kr

 


풀이

 

알고리즘은 따로 고민할 것이 없었고 문제에 주어진 그대록 구현하는 문제였다.

간단히 하자면 다음과 같다.

  1. 두 자씩 잘라 리스트에 넣는다.
  2. 영문자 아닌건 버린다.
  3. 두 리스트의 교집합을 합집합으로 나눈다.

 

def solution(str1, str2):
    
    sp_str1 = []
    sp_str2 = []
    for i in range(1, len(str1)):
        if (str1[i-1] + str1[i]).isalpha():
            sp_str1.append((str1[i-1] + str1[i]).lower())
    for i in range(1, len(str2)):
        if (str2[i-1] + str2[i]).isalpha():
            sp_str2.append((str2[i-1] + str2[i]).lower())
    
    #다중집합의 합집합
    tem_sp1 = sp_str1.copy()
    union = sp_str1.copy()
    
    for s2 in sp_str2:
        if s2 in tem_sp1:
            tem_sp1.remove(s2)
        else:
            union.append(s2)

    #다중집합의 교집합 
    intersec = []
    tem_sp1 = sp_str1.copy()
    for s2 in sp_str2:
        if s2 in tem_sp1:
            intersec.append(s2)
            tem_sp1.remove(s2)
    
    if len(union) == 0:
        return 65536
    
    return int(len(intersec)/len(union)*65536)

처음에 영문자 아닌 것을 버리는 단계에서 정규식을 사용해야 하는 줄 알았다.

그래서 match()등을 찾아봤는데 알고보니 isalpha()라는 완전 간편한 함수가 있었다. ㅎ

 

파이썬에 set이라는 자료형(?)이 있는 것을 알고 있었다.

교집합과 합집합을 쉽게 구해주는데, 중복을 제거하기 때문에 이번 문제에서 원하는 바와는 맞지 않았다.

 

혹시 다른 쉬운 방법이 있나 검색해보았는데 그냥 직접 만들길래 별다른 방법이 없는 것 같아 나도 직접 했다.

 


다른 사람의 풀이

import re
import math

def solution(str1, str2):
    str1 = [str1[i:i+2].lower() for i in range(0, len(str1)-1) if not re.findall('[^a-zA-Z]+', str1[i:i+2])]
    str2 = [str2[i:i+2].lower() for i in range(0, len(str2)-1) if not re.findall('[^a-zA-Z]+', str2[i:i+2])]

    gyo = set(str1) & set(str2)
    hap = set(str1) | set(str2)

    if len(hap) == 0 :
        return 65536

    gyo_sum = sum([min(str1.count(gg), str2.count(gg)) for gg in gyo])
    hap_sum = sum([max(str1.count(hh), str2.count(hh)) for hh in hap])

    return math.floor((gyo_sum/hap_sum)*65536)

완전 파이썬 잘알..

이분은 isalpha() 대신 정규식을 사용하였다.

 

set을 사용하고 min과 max로 다중합집합, 교집합 뽑아낸 부분이 천재적..