2018 KAKAO BLIND RECRUITMENT 뉴스클러스터링 파이썬

1 분 소요

2018 KAKAO BLIND RECRUITMENT 뉴스클러스터링 파이썬 풀이

바로 이전에 풀었던 메뉴리뉴얼 문제와 동일한 2레벨 문제입니다.

하루종일 풀이법에 대해 고민하고 코드를 작성해봤지만, 해결하지 못하고 가장 간결한 모범답안을 참고했습니다. 해당 풀이는 프로그래머스에서 가장 많은 투표수를 받은 해결법을 참고했습니다.

오답 코드(개인적인 풀이)

def solution(str1, str2):
    answer = 0
    set1 = []
    set2 = []

    set1_1 = []
    set2_2 = []
    for i in range(len(str1)):
        for j in range(i + 1, i + 2):
            if j == len(str1):
                break
            else:
                set1.append(str1[i:j + 1])

    for i in range(len(str2)):
        for j in range(i + 1, i + 2):
            if j == len(str2):
                break
            else:
                set2.append(str2[i:j + 1])

    for i in set1:
        if i.isalpha() != False:
            set1_1.append(i.lower())
        else:
            pass

    for i in set2:
        if i.isalpha() != False:
            set2_2.append(i.lower())
        else:
            pass

    # print("set1_1", set1_1)
    # print("set2_2", set2_2)
    itc = []
    combi = set1_1.copy()
    copy1 = set1_1.copy()
    copy2 = set2_2.copy()
    # 합집합 구하기
    for i in set1_1:
        if i in set2_2:
            copy1.remove(i)
            copy2.remove(i)
        else:
            combi.append(i)
            copy1.remove(i)

    # 교집합 구하기
    copy1 = set1_1.copy()
    copy2 = set2_2.copy()

    for i in copy1:
        if i in copy2:
            itc.append(i)
            copy1.remove(i)
            copy2.remove(i)
    #
    # print(itc)
    # print(combi)


    if len(set1_1) == 0 & len(set2_2) == 0:
        answer = 65536
        return answer

    # print(len(set1_1))
    elif (set(set1_1) | set(set2_2)) == (set(set1_1) & set(set2_2)):
        a = min(len(set1_1), len(set2_2))
        b = max(len(set2_2), len(set2_2))
        answer = int(a / b * 65536)
        return answer

    else:
        answer = int(len(itc) / len(combi) * 65536)
        return answer

채점 결과

정답 코드

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)

해당 문제의 모범 답안을 살펴보면, count 함수와 re모듈의 findall 함수를

적절하게 활용해서 문자열을 슬라이싱 해주었습니다.

리스트 컴프리핸션에 대한 이해와 로직 구성이 정말 간결하다고 생각하고,

앞으로 이런 알고리즘을 짤 수 있도록 하는 것을 목표로 연습하고 싶다는 목표가 생겼습니다.

알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady

댓글남기기