/ ALGORITHM

(프로그래머스 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')