[Programmers] 후보킀

Updated:

후보킀

후보킀 λ₯Ό ν΄λ¦­ν•˜λ©΄ λ°”λ‘œ μ΄λ™ν•œλ‹€.

λ¦΄λ ˆμ΄μ…˜μ΄ 주어지면 ν•΄λ‹Ή λ¦΄λ ˆμ΄μ…˜μ—μ„œ λͺ‡ 개의 후보킀λ₯Ό λ§Œλ“€ 수 μžˆλŠ”μ§€ λ°˜ν™˜ν•˜λ©΄ λ˜λŠ” 문제.

속성을 가지고 λͺ¨λ“  ν‚€ 쑰합을 λ§Œλ“  λ’€ μœ μΌμ„±, μ΅œμ†Œμ„±μ„ λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ”μ§€ ν™•μΈν•˜λ©΄ λœλ‹€.

νŠœν”Œλ‘œ 주어지기 λ•Œλ¬Έμ— map, zip 을 μ΄μš©ν•΄ 속성끼리 묢은 λ’€ μ‹œμž‘ν–ˆλ‹€.


λ§Œμ•½ 속성이 λ„€ 가지가 μžˆλŠ” λ¦΄λ ˆμ΄μ…˜μ΄ 주어진닀면 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  ν‚€ 쑰합은

(0), (1), (2), (3), (0, 1), (0, 2), (0, 3), (0, 1, 2), (0, 1, 3), (1, 2, 3), (0, 1, 2, 3) 이 μžˆλ‹€.

μ΅œμ†Œμ„±μ„ ν™•μΈν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ‘°ν•©μ˜ 크기가 μž‘μ€ μˆœμ„œλΆ€ν„° μ²΄ν¬ν•˜λ©΄ λœλ‹€.

μš°μ„  각 속성이 ν‚€κ°€ 될 수 μžˆλŠ”μ§€ 검사 ν•œλ‹€. ν‚€κ°€ 될 수 μžˆλŠ” 경우 candidate λ¦¬μŠ€νŠΈμ— λ‹΄λŠ”λ‹€.

λ§Œμ•½ κ²€μ‚¬ν•˜λŠ” ν‚€ 쑰합에 일뢀가 이미 candidate λ¦¬μŠ€νŠΈμ— μžˆλ‹€λ©΄ μ œμ™Έν•œλ‹€. μ΅œμ†Œμ„±μ— μœ„λ°˜ 되기 λ•Œλ¬Έμ΄λ‹€.

μ΄λ ‡κ²Œ λͺ¨λ“  ν‚€ 쑰합을 검사 ν•œ λ’€ candidate 리슀트 길이λ₯Ό λ°˜ν™˜ ν•˜λ©΄ λœλ‹€.

from itertools import combinations


def solution(relation):
	attribute = list(map(list, zip(*relation)))
	candidate = []

	for i in range(1, len(attribute) + 1):
		attribute_num = map(list, combinations([val for val in range(len(attribute))], i))
		for j in attribute_num:
			check = []
			for k in j:
				check.append(attribute[k])
			if len(set(zip(*check))) == len(attribute[0]):
				for cur in candidate:
					if cur.issubset(set(j)):
						break
				else:
					candidate.append(set(j))

	return len(candidate)

Categories:

Updated:

Leave a comment