본문 바로가기

알고리즘

부분집합 구하기

문제) 'A','B','C','D' 의 데이터 셋이 있다. 이 데이터 셋에 대한 부분집합을 모두 구하시오.

풀이

이 문제의 핵심은 부분집합을 구하는것 인데, 알고리즘적으로 부분집합을 구하는 방법은 다양하게 있겠지만 for문과 if문으로 해결하기에는 꽤나 복잡해 질 수 있지만 문제의 '집합'이라는 단어에 집중해서 문제풀면 꽤나 간단 해진다. 

파이썬의 내장 함수인 set()함수를 이용하면 값을 집합의 형식으로 사용할 수 있다.

이중 for문을 모두 돌리면 나오는 AB,BA 나 ACD,CAD,CDA,DAC,DCA 등의 조합은 모두 같은 부분집합인 것을 알 수 있다. 집합이기 때문에 역시 파이썬의 내장함수인 union() -> 합집합을 이용하면 위의 ACD, CAD같은 부분집합을 모두 하나의 집합으로 합쳐버릴 수 있다. 

중복없이 부분집합을 코드로 구현해보자!

dataSet = ["A","B","C","D"]
subSet = []

def makeCandidate(dataSet):
    mCand = []
    for i in range(len(dataSet)):
        for j in range(i+1, len(dataSet)):
            set1 = set(dataSet[i]).union(set(dataSet[j])) #중복 부분집합 합치기
            if len(set1) > len(dataSet[i]) + 1:
                continue
            list1 = list(set1)
            list1.sort()	#부분집합을 정렬
            if tuple(list1) not in mCand:
                mCand.append(tuple(list1))
    return mCand   

tempSet = dataSet
for i in range(1,len(dataSet)):        
    tempSet = makeCandidate(tempSet)
    subSet.append(tempSet)
    
print(subSet)  
[[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')], [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D')], [('A', 'B', 'C', 'D')]]

 

'알고리즘' 카테고리의 다른 글

기능개발  (0) 2020.04.24
프린터  (0) 2020.04.24
다리를 지나는 트럭  (1) 2020.04.24
2 x n 타일링  (0) 2020.04.24
124 나라의 숫자  (0) 2020.04.24