코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [1차] 뉴스 클러스터링
https://school.programmers.co.kr/learn/courses/30/lessons/17677
코드
def makeArrays(sstr): #"FRANCE", "aa1+aa2" # 다중집합 만들기
sstr = sstr.lower()
sstr = list(sstr+ " ") # 문자열 한글자씩 끊기
for i in range(len(sstr)-1):
sstr[i] = sstr[i] + sstr[i+1]
new_sstr = []
for s in sstr:
if len(s) == 2 and 97 <= ord(s[0]) <= 122 and 97 <= ord(s[1]) <= 122:
new_sstr.append(s)
return new_sstr
def findIntersect(str1, str2): # 교집합의 개수 구하기
intersectArray = []
for s1 in str1:
if s1 in str2: # 두 집합의 원소가 동일하다면
intersectArray.append(s1)
str2.remove(s1)
return len(intersectArray)
def solution(str1, str2):
answer = 0
# 다중집합 만들기
str1 = makeArrays(str1)
str2 = makeArrays(str2)
# 교집합의 개수 구하기
str1Len1, str2Len2 = len(str1), len(str2)
numberOfIntersect = 0
if str1Len1 <= str2Len2:
numberOfIntersect = findIntersect(str1, str2)
else:
numberOfIntersect = findIntersect(str2, str1)
# 자카드 유사도
if len(str1) == 0 and len(str2) == 0:
answer = 1 * 65536
else:
answer = int(numberOfIntersect / (str1Len1+str2Len2-numberOfIntersect) * 65536)
return answer
풀이
직접 다중 집합을 만든 후, 교집합의 개수 구하기
코드2
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)
풀이
파이썬의 내장 함수인 정규식 활용