문제) '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 |