다중집합의 교집합과 합집합

do yeon kim·2022년 12월 15일
0

교집합과 합집합

우리가 평상시에 사용하는 집합의 경우는 중복된 수가 포함되지 않는다.
예를 들어 a = [1,1,2,3] 리스트가 있고 이를 집합으로 표현하게 되면
a= {1,2,3}으로 중복된 1은 사라진게 된다. 이는 집합의 성질로 중복된 값을 허용하지 않는것이다. 그렇기 때문에 집합 a, b에 대한 교집합과 합집합을 구하게 되며, 아래와 같은 형태가 된다.

a = {1,2,3}
b = {1,3,5}

a & b = {1,3}
a | b = {1,3,5}

하지만 경우에 따라서 다중집합(중복된 원소가 포함될 수 있는)에 대한 교집합과 합집합을 알아야하는 경우도 발생한다. 이때 어떻게 하면 될까??


다중집합

다중집합에 대한 교집합과 합집합을 구하는 방법은 직접 해당 함수를 구현하는 것이다.
a = [1,1,2,2,3,4,5] b = [2,2,3,4] 이라는 예가 있을 경우 해당 리스트에 대한 다중집합을 구해보자!! 먼저 a와b를 set()함수를 이용해서 집합으로 만들면은 해당 원소의 중복된 값이 사라지기 때문에 리스트 형태를 그대로 이용해야 한다.

다중집합 교집합


def make_multi_intersection(a, b):
    multi_inter = []
    temp_b = b.copy()
    for i in a:
        if i in temp_b:
            temp_b.remove(i)
            multi_inter.append(i)
    return multi_inter


a = [1,1,2,2,3,4,5] 
b = [2,2,3,4]

a를 돌면서 해당 하나의 원소가 b에 있다면 미리 선언한 리시트에 해당 값을 더해준다. 그리고 해당 값을 제거해준다. 이때 제거해주는 리스트의 값은 미리 설정한 b의 copy본이어야 한다. 그렇지 않다면 해당 b라는 해당 리스트의 값 자체가 변경되기 때문에, 다음에 b라는 리스트가 사용될 경우 원본의 형태를 잃게 된다.

다중집합 합집합

def make_multi_union(a,b):
    temp_a = a.copy()
    multi_union = a.copy()
    for x in b:
        if x not in temp_a:
            multi_union.append(x)
        else:
            temp_a.remove(x)
    return multi_union

a = [1,1,2,2,3,4,5] 
b = [2,2,3,4]

두 집합의 합집합은 하나의 집합의 원소에 다른 하나의 원소를 더하는 것이다. 그렇기 때문에 하나의 집합을 먼저 copy해서 multi_union으로 만들고서 해당 리스트에 값을 추가한다. b를 돌면서 b의 원서가 다른 copy본인 temp_a에 없다면 multi_union에 더해준다. 만약 해당 값이 있다면 temp_a에서 제거해준다. 위에서 copy를 사용한 이유는 해당 리스트 자체를 변경하게 되면 뒤에 사용될 경우 해당 값이 변경된 형태로 사용되기 때문이다.

0개의 댓글