728x90
반응형

* 본 포스팅은 주피터 노트북에서 실행했다.

 

def product_set(set1,set2):
    res=set()
    for i in set1:
        for j in set2:
            res = res | {(i,j)}
    return res
A = {1,3}
B = {2,4}
AxB = product_set(A,B)
print('A= ',A)
print('B= ',B)
print('AxB= ',AxB)

SQL의 Cross Join과 동일하다. 데카르트의 곱

 

곱집합 함수를 이용한 집합의 세제곱 연산

def product_set(set1,set2):
    res=set()
    for i in set1:
        for j in set2:
            res = res | {(i,j)}
    return res
def exp(input_set, exponent):
    res=input_set
    for _ in range(exponent-1):
        res=product_set(res,input_set) #호출한 결과를 res에 누적하여 반환함
    return res
A = {1,3}
A3 = exp(A,3) #집합 A에 대하셔 거듭 제곱을 3회 수행함
print(A3)

 

이를 참고하여 주사위를 두번 던졌을 때 가지수를 구해보자

cases={1,2,3,4,5,6}
cases_2times = product_set(cases, cases)
cases_2times #주사위 두번던졌을 때 가지수

 

#주사위 2번 던졌을 때 set이라 36이 안나오고 11가지 밖에 없음
sum_set ={sum(tup) for tup in cases_2times}
sum_set

 

위 코드를 list로 변환해 보았다.

sum_set =[sum(tup) for tup in cases_2times]
len(sum_set)

 

주사위 3번 던졌을 때 경우의 수 구하기

def tuple_sum(tup):
    if isinstance(tup, int): #tup가 정수(int) 형이면 tup을 반환
        return tup
    else:
        accum=0
        for element in tup:
            accum += tuple_sum(element) #재귀적 호출, 자기 자신 호출
    return accum
def product_set(set1,set2):
    res=set()
    for i in set1:
        for j in set2:
            res = res | {(i,j)}
    return res
cases_3times = product_set(cases, cases_2times)
sums={tuple_sum(tup) for tup in cases_3times}
sums

 

728x90
반응형

+ Recent posts