[프로그래머스] 뉴스 클러스트링 문제 풀이 python

mauz·2022년 6월 19일
0

🐒 문제

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

✍ 나의 풀이

from collections import Counter

def solution(str1, str2):
    str1, str2 = str1.upper(), str2.upper()
    arr1, arr2 = [], []
    
    for i in range(1,len(str1)):
        if str1[i-1].isalpha() and str1[i].isalpha():
            arr1.append(str1[i-1] + str1[i])
    for i in range(1,len(str2)):
        if str2[i-1].isalpha() and str2[i].isalpha():
            arr2.append(str2[i-1] + str2[i])
    
    
    counter1 = Counter(arr1)
    counter2 = Counter(arr2)
    
    inter = list((counter1&counter2).elements())
    union = list((counter1|counter2).elements())

    if len(union) == 0 and len(inter) == 0:
        return 65536
    else:
        return int(len(inter) / len(union) * 65536)

참고한풀이

다중집합을 구하는 부분에서 막혀서 검색을 한 결과,

Counter 클래스간 연산 기능중에 교집합 합집합 기능을 이용하면 쉽게 풀 수 있음을 알게되었다.


🧠 문제 이해

Counter 클래스의 기능 블로그

원소의 중복을 허용하는 다중집합을 이용해 문제를 풀어야하는데

counter1 & counter2 로 교집합을 구하고
counter1 | counter2 로 합집합을 구한뒤

Counter의 .elements() 메소드를 이용하여
key를 value 값 만큼 뱉어내게 하면 다중집합을 구할 수 있다.

이때의 다중집합의 길이를 이용해 문제를 풀 수 있다.


코드

from collections import Counter

def solution(str1, str2):
    str1, str2 = str1.upper(), str2.upper()	# 대,소문자 구분 없어야 하므로 대문자로 변환
    arr1, arr2 = [], []
    
    for i in range(1,len(str1)):	
        if str1[i-1].isalpha() and str1[i].isalpha():
            arr1.append(str1[i-1] + str1[i])
    for i in range(1,len(str2)):
        if str2[i-1].isalpha() and str2[i].isalpha():
            arr2.append(str2[i-1] + str2[i])
         #입력으로 들어온 문자열은 두 글자씩 끊어서 다중집합의 원소로 만든다. 
          #기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다. 
    
    
    counter1 = Counter(arr1)
    counter2 = Counter(arr2)
    
    inter = list((counter1&counter2).elements())	# 다중집합의 교집합
    union = list((counter1|counter2).elements())	# 다중집합의 합집합

    if len(union) == 0 and len(inter) == 0:	#나누기 연산에서 0이 들어가면 오류가 발생하니 예외처리
        return 65536
    else:
        return int(len(inter) / len(union) * 65536)
profile
쥐구멍에 볕드는 날

0개의 댓글