본문 바로가기

알고리즘/프로그래머스

[Python] [1차] 뉴스 클러스터링

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

 

프로그래머스

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

programmers.co.kr

  • 나의 풀이(틀림)
# [1차] 뉴스 클러스터링

def solution(str1, str2):
    import math
    import re
    
    str1 = str1.lower()
    str2 = str2.lower()
    
    str1 = re.sub(r'[^a-z]', ' ', str1)
    str2 = re.sub(r'[^a-z]', ' ', str2)
    
    set_1 = []
    set_2 = []
    for i in range(len(str1)-1):
        str_comb_1 = str1[i:i+2]
        if not ' ' in str_comb_1:
            set_1.append(str_comb_1)
            
    for j in range(len(str2)-1):
        str_comb_2 = str2[j:j+2]
        if not ' ' in str_comb_2:
            set_2.append(str_comb_2)
    
    union = 0
    intersection = 0
    
    for i, j in zip(set_1, set_2):
        if i in set_2:
            intersection += min(set_1.count(i), set_2.count(i))
            union += max(set_1.count(i), set_2.count(i))
        elif j in set_1:
            intersection += min(set_1.count(j), set_2.count(j))
            union += max(set_1.count(j), set_2.count(j))
        else:
            union += set_1.count(i)
            union += set_2.count(j)
        
        
    if union == intersection :
        return 65536
    else:
        answer = math.floor((intersection / union) * 65536)
        return answer

몇 가지 예제에서 틀리길래 왜 그런가... 하고 생각해봤는데 저 zip하는 부분에서 두 개의 리스트가 길이가 다르면 길이가 짧은 리스트 기준으로만 실행되는 걸 고려안해서 틀렸음...

 

왜 틀렸는지 한참 찾았네

 

  • 다른 풀이(맞음)
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)

set으로 바꿔버리면 중복이 제거되는데

 

밑에서 따로 개수를 구해버리면 되는거였음.... ㅎㅎ

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Python] 콜라 문제  (0) 2022.12.30
[Python] 소수 만들기  (0) 2022.12.29
[Python] 프린터  (0) 2022.12.24
[Python] 모의 고사  (0) 2022.12.23
[Python] 소수 찾기  (0) 2022.12.21