본문 바로가기

알고리즘/프로그래머스(Python)

[알고리즘] 프로그래머스 뉴스 클러스터링 / python

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

✔ 풀이

lower함수로 전체 소문자 만들어주기

isalpha함수로 알파벳이 아닌 문자 제거

def solution(str1, str2):
    m1, m2 = [], []
    str1 = str1.lower()
    str2 = str2.lower()
    for i in range(len(str1)-2):
        if str1[i:i+2].isalpha():
            m1.append(str1[i:i+2])
    if str1[len(str1)-2:].isalpha():
        m1.append(str1[len(str1)-2:])

    for i in range(len(str2)-2):
        if str2[i:i+2].isalpha():    
            m2.append(str2[i:i+2])
    if str2[len(str2)-2:].isalpha():
        m2.append(str2[len(str2)-2:])

    inter, uni = 0, len(m1) + len(m2)
    for s in m1:
        if s in m2:
            inter += 1
            m2.remove(s)

    if uni == 0:
        return 65536
    else:
        return  int((inter / (uni - inter)) * 65536)

코드가 겁나 긴데.. re모듈을 활용하면 짧게 가능하다.

 

✔ 다른코드 풀이

if not re.findall('[^a-zA-Z]+', str1[i:i+2])  #알파벳을 제외한 문자가 있다면 배열에 넣지 않음

gyo = set(str1) & set(str2)  #set으로 형변환하고 교집합을 구한다.

hap = set(str1) | set(str2)  #set으로 형변환하고 합집합을 구한다.

sum([min(str1.count(gg), str2.count(gg)) for gg in gyo])  #set으로 형변환될때 중복인 원소들이 없어졌기 때문에 실제 교집합의 크기를 구한다.

sum([max(str1.count(hh), str2.count(hh)) for hh in hap])  #set으로 형변환될때 중복인 원소들이 없어졌기 때문에 실제 합집합의 크기를 구한다.

import re

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 int((gyo_sum/hap_sum)*65536)