λ¬Έμ μ€λͺ
ν보ν€
νλ μ¦λνκ΅ μ»΄ν¨ν°κ³΅νκ³Ό μ‘°κ΅μΈ μ μ΄μ§λ λ€μ€ νκ³Όμ₯λμ μ§μλ‘, νμλ€μ μΈμ μ¬νμ μ 리νλ μ 무λ₯Ό λ΄λΉνκ² λμλ€.
κ·Έμ νλΆ μμ νλ‘κ·Έλλ° κ²½νμ λμ΄λ €, λͺ¨λ μΈμ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ£κΈ°λ‘ νμκ³ , μ΄λ₯Ό μν΄ μ 리λ₯Ό νλ μ€μ ν보ν€(Candidate Key)μ λν κ³ λ―Όμ΄ νμνκ² λμλ€.
ν보ν€μ λν λ΄μ©μ΄ μ κΈ°μ΅λμ§ μλ μ μ΄μ§λ, μ νν λ΄μ©μ νμ νκΈ° μν΄ λ°μ΄ν°λ² μ΄μ€ κ΄λ ¨ μμ μ νμΈνμ¬ μλμ κ°μ λ΄μ©μ νμΈνμλ€.
- κ΄κ³ λ°μ΄ν°λ² μ΄μ€μμ 릴λ μ΄μ
(Relation)μ νν(Tuple)μ μ μΌνκ² μλ³ν μ μλ μμ±(Attribute) λλ μμ±μ μ§ν© μ€, λ€μ λ μ±μ§μ λ§μ‘±νλ κ²μ ν보 ν€(Candidate Key)λΌκ³ νλ€.
- μ μΌμ±(uniqueness) : 릴λ μ΄μ μ μλ λͺ¨λ ννμ λν΄ μ μΌνκ² μλ³λμ΄μΌ νλ€.
- μ΅μμ±(minimality) : μ μΌμ±μ κ°μ§ ν€λ₯Ό ꡬμ±νλ μμ±(Attribute) μ€ νλλΌλ μ μΈνλ κ²½μ° μ μΌμ±μ΄ κΉ¨μ§λ κ²μ μλ―Ένλ€. μ¦, 릴λ μ΄μ μ λͺ¨λ ννμ μ μΌνκ² μλ³νλ λ° κΌ νμν μμ±λ€λ‘λ§ κ΅¬μ±λμ΄μΌ νλ€.
μ μ΄μ§λ₯Ό μν΄, μλμ κ°μ νμλ€μ μΈμ μ¬νμ΄ μ£Όμ΄μ‘μ λ, ν보 ν€μ μ΅λ κ°μλ₯Ό ꡬνλΌ.
μμ μλ₯Ό μ€λͺ
νλ©΄, νμμ μΈμ μ¬ν 릴λ μ΄μ
μμ λͺ¨λ νμμ κ°μ μ μΌννλ²μ κ°μ§κ³ μλ€. λ°λΌμνλ²μ 릴λ μ΄μ
μ ν보 ν€κ° λ μ μλ€.
κ·Έλ€μμ΄λ¦μ λν΄μλ κ°μ μ΄λ¦(apeach)μ μ¬μ©νλ νμμ΄ μκΈ° λλ¬Έμ,μ΄λ¦μ ν보 ν€κ° λ μ μλ€. κ·Έλ¬λ, λ§μ½ [μ΄λ¦,μ 곡]μ ν¨κ» μ¬μ©νλ€λ©΄ 릴λ μ΄μ
μ λͺ¨λ ννμ μ μΌνκ² μλ³ κ°λ₯νλ―λ‘ ν보 ν€κ° λ μ μκ² λλ€.
λ¬Όλ‘ [μ΄λ¦,μ 곡,νλ
]μ ν¨κ» μ¬μ©ν΄λ 릴λ μ΄μ
μ λͺ¨λ ννμ μ μΌνκ² μλ³ν μ μμ§λ§, μ΅μμ±μ λ§μ‘±νμ§ λͺ»νκΈ° λλ¬Έμ ν보 ν€κ° λ μ μλ€.
λ°λΌμ, μμ νμ μΈμ μ¬νμ ν보ν€λνλ², [μ΄λ¦,μ 곡] λ κ°κ° λλ€.
릴λ μ΄μ μ λνλ΄λ λ¬Έμμ΄ λ°°μ΄ relationμ΄ λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, μ΄ λ¦΄λ μ΄μ μμ ν보 ν€μ κ°μλ₯Ό return νλλ‘ solution ν¨μλ₯Ό μμ±νλΌ.
μ νμ¬ν
- relationμ 2μ°¨μ λ¬Έμμ΄ λ°°μ΄μ΄λ€.
- relationμ 컬λΌ(column)μ κΈΈμ΄λ1μ΄μ8μ΄νμ΄λ©°, κ°κ°μ 컬λΌμ 릴λ μ΄μ μ μμ±μ λνλΈλ€.
- relationμ λ‘μ°(row)μ κΈΈμ΄λ1μ΄μ20μ΄νμ΄λ©°, κ°κ°μ λ‘μ°λ 릴λ μ΄μ μ ννμ λνλΈλ€.
- relationμ λͺ¨λ λ¬Έμμ΄μ κΈΈμ΄λ1μ΄μ8μ΄νμ΄λ©°, μνλ²³ μλ¬Έμμ μ«μλ‘λ§ μ΄λ£¨μ΄μ Έ μλ€.
- relationμ λͺ¨λ ννμ μ μΌνκ² μλ³ κ°λ₯νλ€.(μ¦, μ€λ³΅λλ ννμ μλ€.)
μ μΆλ ₯ μ
relationresult
[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] | 2 |
μ μΆλ ₯ μ μ€λͺ
μ
μΆλ ₯ μ #1
λ¬Έμ μ μ£Όμ΄μ§ 릴λ μ΄μ
κ³Ό κ°μΌλ©°, ν보 ν€λ 2κ°μ΄λ€.
νμ΄
μ°μ , λ¬Έμ κ° μ΄λ ΅λ€κΈ°λ³΄λ€, ꡬνμ΄ λΉ‘μΌ λ¬Έμ μ΄λ€.
κ²°κ΅ λ¬Έμ λ₯Ό νμ§ λͺ»νκ³ , λ
Έκ°λ€λ₯Ό λ°λ³΅νλ€κ° ν΄λ΅μ λ΄λ²λ Έλ€.
μΉ΄μΉ΄μ€ μ½ν
λ¬Έμ μΈλ°, μ΄ μ λ ꡬνμ΄λ©΄ Pythonμ΄ μλλ©΄ νκΈ° κ΅μ₯ν λΉ‘μΈλ€. μΉ΄μΉ΄μ€λ μ΄λ° μ νμ λ¬Έμ λ₯Ό μ’μνλ κ² κ°μλ°, κ°μΈμ μΈ μκ°μΌλ‘ μΉ΄μΉ΄μ€ μ½ν
λ νμ΄μ¬μ΄ κ΅μ₯ν μ 리νλ€.(C++λ‘λ§ 500λ¬Έμ μ΄μμ νμλλ°, μ΅κ·Όμ Python μΌλ‘ κ°μν μ΄μ λ€.)
μ΄ λ¬Έμ λ Set
μλ£κ΅¬μ‘°λ₯Ό κΉμν 묻λ λ¬Έμ μκ³ , νΉμ Bit mask
λ‘λ ν μ μλ€. κ°μΈμ μΌλ‘ λμ΄λ 3μ μ€μΌν κ² κ°μλ°, λμ΄λ 2λ‘ λ°°μ λμ΄μλκ² μ κΈ°ν λ¬Έμ μλ€.
ν΄λ΅μ κ³Όμ μ, μ°μ λͺ¨λ μΌμ΄μ€λ₯Ό allCandidates
λ°°μ΄μ λ£μκ³ , μ΄ μ€ ν보ν€μ 첫λ²μ§Έ μ±μ§μΈ μ μΌμ±
μ λ§μ‘±νμ§ μλ μΌμ΄μ€λ₯Ό λ°°μ νλ€.
κ·Έ ν, μ΅μμ±
μ λ§μ‘±νμ§ μλ μΌμ΄μ€λ₯Ό νλ² λ λ°°μ νμ¬ ν μ μλ€.
from itertools import combinations
def solution(relation):
n_row = len(relation)
n_col = len(relation[0])
allCandidates = []
for i in range(1, n_col+1):
allCandidates.extend(combinations(range(n_col), i))
print(allCandidates)
candidateKeys = []
for candidate in allCandidates:
tuples = [ tuple(row[idx] for idx in candidate ) for row in relation ]
if len(set(tuples)) == n_row:
candidateKeys.append(candidate)
answer = set(candidateKeys[:])
print(answer)
for i in range(len(candidateKeys)):
for j in range(i+1, len(candidateKeys)):
if len(candidateKeys[i]) == len(set(candidateKeys[i]).intersection(set(candidateKeys[j]))):
answer.discard(candidateKeys[j])
return len(answer)
무μμ κ°μ ν μ μλκ°?
μ¬μ€ μ΄ λ¬Έμ λ κ°μΈμ μΌλ‘ Bit Mask
λ¬Έμ μ κ°κΉλ€κ³ μκ°νλ€.
λ§μ½ Pythonμ΄ μλ, λ€λ₯Έ μΈμ΄λ‘ μ΄ λ¬Έμ λ₯Ό νλ €λ©΄ κ±°μ 무쑰건 Bit Mask
μ μ¨μΌν κ²μ΄λ€.. κ·Έλ μ§ μμΌλ©΄ μ½λ λΌμΈμ΄ 100μ€μ΄ λμ΄κ°μ§ λͺ¨λ₯Έλ€..
λ€μ μ½λλ Bit Mask
νμ΄μ΄λ©°, κ°μΈμ μΌλ‘ μ΄ μ½λλ₯Ό λ³΄κ³ μκ΄΄κ°μ λ€μλ€.
μ μ μμ μ§ν©μ 무쑰건 λΉνΈλ§μ€ν¬λ‘ ν μ μλλ°, μ΄λ₯Ό μκ°νμ§ λͺ»νλ€λ.. PSλ₯Ό λ무 μ¬μλ보λ€.
def solution(relation):
answer_list = list()
for i in range(1, 1 << len(relation[0])):
tmp_set = set()
for j in range(len(relation)):
tmp = ''
for k in range(len(relation[0])):
if i & (1 << k):
tmp += str(relation[j][k])
tmp_set.add(tmp)
if len(tmp_set) == len(relation):
not_duplicate = True
for num in answer_list:
if (num & i) == num:
not_duplicate = False
break
if not_duplicate:
answer_list.append(i)
return len(answer_list)
'Problem Solving π₯ > νλ‘κ·Έλλ¨Έμ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€] νμ ν°λ¨λ¦¬κΈ° / νμ΄μ¬ / (μ΅μ, μ΅λ, ν) (2) | 2021.01.18 |
---|---|
[νλ‘κ·Έλλ¨Έμ€] νμΌλͺ μ λ ¬ / νμ΄μ¬ (0) | 2021.01.17 |
[νλ‘κ·Έλλ¨Έμ€] nμ§μ κ²μ / νμ΄μ¬ (0) | 2021.01.17 |
[νλ‘κ·Έλλ¨Έμ€] μμΆ / νμ΄μ¬ / (λμ λ리) (0) | 2021.01.16 |
[νλ‘κ·Έλλ¨Έμ€ ] λ°©κΈ κ·Έ 곑 / νμ΄μ¬ (0) | 2021.01.15 |