본문 바로가기

코딩테스트/프로그래머스

코딩테스트 연습2018 KAKAO BLIND RECRUITMENT[1차] 뉴스 클러스터링

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

 

프로그래머스

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

programmers.co.kr

Solution

def to_ag(st):
    ag1 = []
    for i in range(len(st)-1):
        con = False
        tempstr = st[i:i+2]
        tempstr = tempstr.lower()
        for ts in tempstr:
            if ord(ts) >= 97 and ord(ts) <= 122:
                pass
            else:
                con = True
        
        if con:
            continue
        else:
            ag1.append(tempstr)
    return ag1

def solution(str1, str2):
    answer = 0
    ag1 = to_ag(str1)
    ag2 = to_ag(str2)
    ag1set = set(ag1)
    ag2set = set(ag2)
    ag1set.update(ag2set)
    gyo = 0
    hap = 0 
    for s in ag1set:
        cnt1 = ag1.count(s)
        cnt2 = ag2.count(s)
        gyo += min(cnt1, cnt2)
        hap += max(cnt1, cnt2)
    
    return ( gyo/hap ) * 65536 //1 if not (gyo == 0 and hap == 0) else 65536

주어진 두 문자열을 두 글자씩 끊어서 다중집합의 원소로 만들고, 자카드 유사도를 계산하는 문제이다. 자카드 유사도는 두 집합의 교집합 크기를 합집합 크기로 나눈 값으로 정의되며, 대소문자는 무시한다. 문자열에는 영문자로 된 글자 쌍만 유효하며, 기타 문자는 버린다. 주어진 문자열을 처리하여 자카드 유사도를 계산하고, 정수 부분을 출력한다.

처음 문제 지문이 엄청 길어서 당황했는데, 차근차근 읽어가니 이해하기 어려운 부분은 없었다. 다만, 특수문자는 버려야하는데, 여기서 아스키코드로 변환해 특수문자를 쳐내면 되겠다는 생각이 들었고, ord 함수를 사용하여 풀어야겠다고 생각이 들었다. 과정이 몇개로 합쳐진 문제인데 하나하나 개념만 잘 박혀있으면 어렵지 않게 풀 수 있었다.

 

다른 사람의 풀이 

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)

 

다른 사람의 풀이를 봤는데 정말 어지러웠다. re.findall 함수로 a~Z까지 수를 찾아서 비교하는 듯 하다. 나랑 비슷하게 풀었지만 코딩테스트에서 보통 인터넷 검색이 허용되지 않으므로 ord 방식으로 푸는게 더 나은듯하다.