1 분 소요

문제 링크

내 풀이

# 집합 => 원소 중복 허용하는 다중집합
# 다중합집합, 다중교집합
# 영문자로 된 글자 쌍만 유효
# "AB"와 "Ab", "ab"는 같은 원소로 취급

# 두글자씩 자르면서 리스트에 append하는데 혹시 영문자 제외 다른 것이 들어있을 경우
# append 하지 않는다
# 영문자로 구성된것이 확인되면 append 할때 .lower()로 소문자화 후 넣는다

def solution(str1, str2):
    i, j = 0, 0
    s1_list, s2_list = [], []
    while i < len(str1) - 1:
        s1 = str1[i:i+2]
        if s1.isalpha():
            s1_list.append(s1.lower())
        i += 1
    while j < len(str2) - 1: 
        s2 = str2[j:j+2]
        if s2.isalpha():
            s2_list.append(s2.lower())
        j += 1
    
    s1_list_temp = s1_list.copy()
    s1_list_result = s1_list.copy()
    
    for word in s2_list:
        if word not in s1_list_temp:
            s1_list_result.append(word)
        else:
            s1_list_temp.remove(word)
    gyo = []
    
    for word in s2_list:
        if word in s1_list:
            gyo.append(word)
            s1_list.remove(word)
    
    if len(s1_list_result) == 0:
        return 65536
    else:
        answer = len(gyo) / len(s1_list_result)
    
    return int(answer * 65536) 

다른 풀이

from collections import Counter
def solution(str1, str2):
    # make sets
    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()]
    if not s1 and not s2:
        return 65536
    c1 = Counter(s1)
    c2 = Counter(s2)
    answer = int(float(sum((c1&c2).values()))/float(sum((c1|c2).values())) * 65536)
    return answer

풀이 해석

  • list comprehension 을 통해 s1, s2를 표현하였음
  • Counter 함수를 이용해 각각의 중복된 함수를 표현하고
  • 합집합 차집합을 통해 각각의 갯수를 갱신하였다
  • 그 후 합집합, 교집합 한 values의 합을 이용해 answer를 도출하였다

배울 점

  • 리스트 컴프리핸션의 사용
  • Counter함수에서 합집합, 교집합 이용하기

댓글남기기