(프로그래머스 with python) 뉴스 클러스터링
Level2 - 거리두기 확인하기
https://programmers.co.kr/learn/courses/30/lessons/17677
이 문제는 다중집합
을 구현할 줄 알면 풀 수 있는 문제이다. set을 사용하면 중복을 제거하게 되는데 이 문제는 중복도 포함해서 카운트 해야한다
- copy로 얇은 복사를 통해
다중집합의 합집합
과다중집합의 교집합
을 구했다
from itertools import combinations
import math
def solution(str1, str2):
s1 = []
s2 = []
str1 = list(str1.lower())
str2 = list(str2.lower())
for i in range(1, len(str1)):
st = str1[i - 1] + str1[i]
s1.append(st)
for i in range(1, len(str2)):
st = str2[i - 1] + str2[i]
s2.append(st)
s1 = list(filter(str.isalpha, s1)) # 단 두줄로 s1,s2의 리스트를 만들 수 있음
s2 = list(filter(str.isalpha, s2)) # s1 = [str1[i:i+2].lower() for i in range(len(str1) - 1) if str1[i:i+2].isalpha()]
# s2 = [str2[i:i+2].lower() for i in range(len(str2) - 1) if str2[i:i+2].isalpha()]
s1_tmp = s1.copy() # 다중집합의 합집합
s1_res = s1.copy()
if not s1 and not s2:
return 1 * 65536
for i in s2:
if i not in s1_tmp:
s1_res.append(i)
else:
s1_tmp.remove(i)
s1_tmp2 = s1.copy() # 다중집합의 교집합
re = []
for i in s2:
if i in s1_tmp2:
re.append(i)
s1_tmp2.remove(i)
answer = math.trunc(len(re) / len(s1_res) * 65536)
return answer
solution('E=M*C^2','E=M*C^2')