2020 KAKAO BLIND RECRUITMENT
https://school.programmers.co.kr/learn/courses/30/lessons/17677

머리말

풀이 시간 40분

다중집합의 교집합과 차집합을 어떻게 구할지 몰라 검색해서 알아보았다.

그런데 문제를 다시 보니 해당 부분 어떻게 처리할지 알려줬더라 ㅎㅎ;;

 

다른 풀이 방법을 보니 엄청 깔끔하니 이것도 참고해보자.

 

접근 방법

문제의 요구사항을 차근차근 적용하여 풀었다.

다중집합의 합집합과 교집합을 구하는 방법은 [더 알아보기]를 참조하길 바란다.

 

🐥 이건 얻어가자

  • str.upper(): 문자열을 모두 대문자로 변경
  • str.isalpha(): 문자열이 알파벳인지 확인

 

코드

def solution(str1, str2):
    answer = 0
    
    set1 = makeSet(str1)
    set2 = makeSet(str2)

    # 다중집합의 합집합 구하기
    temp = set1.copy()
    unionSet = set1.copy()
    for i in set2:
        if i not in temp:
            unionSet.append(i)
        else:
            temp.remove(i)
    
    # 다중집합의 교집합 구하기
    temp = set1.copy()
    intersecSet = []
    for i in set2:
        if i in temp:
            temp.remove(i)
            intersecSet.append(i)

    if len(set1) == 0 and len(set2) == 0: return 65536 
    
    answer = int(len(intersecSet) / len(unionSet) * 65536)
    return answer

def makeSet(str):
    setList = []
    str = str.upper()

    i = 0
    while i + 1 < len(str):
        comb = str[i] + str[i+1]
        if comb.isalpha():
            setList.append(comb)
        i += 1
    return setList

다른 풀이

def solution(str1, str2):

    list1 = [str1[n:n+2].lower() for n in range(len(str1)-1) if str1[n:n+2].isalpha()]
    list2 = [str2[n:n+2].lower() for n in range(len(str2)-1) if str2[n:n+2].isalpha()]

    tlist = set(list1) | set(list2)
    res1 = [] #합집합
    res2 = [] #교집합

    if tlist:
        for i in tlist:
            res1.extend([i]*max(list1.count(i), list2.count(i)))
            res2.extend([i]*min(list1.count(i), list2.count(i)))

        answer = int(len(res2)/len(res1)*65536)
        return answer

    else:
        return 65536

더 읽을거리

squareyun