π λ¬Έμ
νλ μ¦λνκ΅ μ»΄ν¨ν°κ³΅νκ³Ό μ‘°κ΅μΈ μ μ΄μ§λ λ€μ€ νκ³Όμ₯λμ μ§μλ‘, νμλ€μ μΈμ μ¬νμ μ 리νλ μ 무λ₯Ό λ΄λΉνκ² λμλ€.
κ·Έμ νλΆ μμ νλ‘κ·Έλλ° κ²½νμ λμ΄λ €, λͺ¨λ μΈμ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ£κΈ°λ‘ νμκ³ , μ΄λ₯Ό μν΄ μ 리λ₯Ό νλ μ€μ ν보ν€(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μ λͺ¨λ ννμ μ μΌνκ² μλ³ κ°λ₯νλ€.(μ¦, μ€λ³΅λλ ννμ μλ€.)
π νμ΄
λ¬Έμ λ₯Ό μ λλ‘ μ΄ν΄νμ§ λͺ»ν΄μ μκ°μ΄ κ±Έλ Έμλ€. μ¬κΈ°μ κ°μ₯ μ€μν κ²μ ν보ν€μ 쑰건μ΄λ€.
1. μ μΌμ±μ λ§μ‘±ν κ².
λͺ¨λ ννμ΄ μ μΌν΄μΌ νλ€. μ¦, λͺ¨λ ν보ν€μ ν΄λΉνλ ννμ΄ μ€λ³΅μ΄ μμ΄μΌ νλ€.
2. μ΅μμ±μ λ§μ‘±ν κ².
νλ‘κ·Έλλ¨Έμ€μμλ μλμ κ°μ΄ μ€λͺ
νλ€.
μ μΌμ±μ κ°μ§ ν€λ₯Ό ꡬμ±νλ μμ±(Attribute) μ€ νλλΌλ μ μΈνλ κ²½μ° μ μΌμ±μ΄ κΉ¨μ§λ κ²μ μλ―Ένλ€. μ¦, 릴λ μ΄μ
μ λͺ¨λ ννμ μ μΌνκ² μλ³νλ λ° κΌ νμν μμ±λ€λ‘λ§ κ΅¬μ±λμ΄μΌ νλ€.
μ΅μμ±μ μ λλ‘ μ΄ν΄νμ§ λͺ»νκ³ , λ¬Έμ λ₯Ό νμ΄λ³΄λ κ³μ ν
μ€νΈμ μ€ν¨..
μ΅μμ±μ λΆλΆ μ§ν©μ΄ μ‘΄μ¬νλ€λ©΄ λ§μ‘±νμ§ λͺ»νλ€. μλ₯Ό λ€μ΄ μ μΌμ±μ λ§μ‘±νλ [A, B], [A, B, C]κ° μλ€κ³ κ°μ νλ€. [A, B]κ° [A, B, C]μ λΆλΆ μ§ν©μ΄κΈ° λλ¬Έμ [A, B, C]λ μ΅μμ±μ λ§μ‘±νμ§ λͺ»νλ€. λ°λΌμ ν보ν€κ° λ μ μλ κ²μ [A, B] μ΄λ€.
λ¨Όμ dfsλ‘ ν¬κΈ°κ° μμ μμλλ‘ μ»¬λΌμ μ‘°ν©λ€μ ꡬνλ€.
μ μΌμ±μ 체ν¬νκΈ° μν΄ Setμ μ΄μ©νλ€. λͺ¨λ ννμ λλ©΄μ 컬λΌμ μ‘°ν©μ ν΄λΉνλ ννλ€μ λ½μλλ€. μ΄λ μ€λ³΅μ΄ μλ€λ©΄ μ μΌμ±μ λ§μ‘±νμ§ λͺ»νλ κ²κ³Ό κ°κΈ° λλ¬Έμ λ€μ λ‘μ§μΌλ‘ λμ΄κ°μ§ λͺ»νλλ‘ νλ€.
μ¬κΈ°κΉμ§ λμ΄μλ€λ©΄ μ μΌμ±μ λͺ¨λ ν΅κ³Όν 컬λΌμ μ‘°ν©μ΄λΌλ λ»μ΄λ€.
μ΄μ μ΅μμ±μ νμΈνλ€. λΆλΆ μ§ν©μ ꡬνκΈ° μν΄ λΉνΈλ₯Ό μ΄μ©νλ€. λΉνΈλ‘ νννλ©΄ 0110κ³Ό 0111μΌλ‘ λνλΌ μ μλ€. 0110μ΄ 0111μ λΆλΆ μ§ν©μΈμ§ νλ¨νκΈ° μν΄ 0110μ 1μ΄ 0111μ λͺ¨λ ν¬ν¨λλμ§ νμΈνλ©΄ λλ€. λ§μ½μ λͺ¨λ ν¬ν¨μ΄ μλλ€λ©΄ candidatesμ λ£μΌλ©΄ λλ€.
λ§μ§λ§μΌλ‘ λͺ¨λ ν보ν€λ₯Ό ꡬνλ©΄ κ·Έλλ‘ candidatesμ μ¬μ΄μ¦λ₯Ό 리ν΄νλ©΄ ν΄κ²° ν μ μλ λ¬Έμ μ΄λ€.
π μ½λ
import java.util.*;
public class νλ³΄ν€ {
String[][] relation;
int colSize;
boolean[] select;
List<int[]> candidates = new ArrayList<>();
public int solution(String[][] relation) {
this.relation = relation;
this.colSize = relation[0].length;
this.select = new boolean[colSize];
for (int i = 0; i < colSize; i++) {
dfs(0, 0, i + 1);
}
return candidates.size();
}
private void dfs(int idx, int cnt, int selectSize) {
if (cnt == selectSize) {
List<Integer> tempColumns = new ArrayList<>();
for (int i = 0; i < colSize; i++) {
if (select[i]) tempColumns.add(i);
}
if (!isUnique(tempColumns)) return;
int[] candidate = new int[colSize + 1];
for (Integer col : tempColumns) {
candidate[col] = 1;
candidate[colSize]++;
}
add(candidate);
}
for (int i = idx; i < colSize; i++) {
if (select[i]) continue;
select[i] = true;
dfs(i, cnt + 1, selectSize);
select[i] = false;
}
}
private boolean isUnique(List<Integer> columns) {
Set<String> tempTuples = new HashSet<>();
for (String[] tuple : relation) {
StringBuilder sb = new StringBuilder();
for (Integer col : columns) {
sb.append(tuple[col]);
}
if (!tempTuples.add(sb.toString())) return false;
}
return true;
}
private void add(int[] requestCandidate) {
for (int[] candidate : candidates) {
int cnt = 0;
for (int i = 0; i < requestCandidate.length - 1; i++) {
if ((candidate[i] & requestCandidate[i]) == 1) cnt++;
if (candidate[colSize] == cnt) return;
}
}
this.candidates.add(requestCandidate);
}
}
νλ‘κ·Έλλ¨Έμ€
μ½λ μ€μ¬μ κ°λ°μ μ±μ©. μ€ν κΈ°λ°μ ν¬μ§μ λ§€μΉ. νλ‘κ·Έλλ¨Έμ€μ κ°λ°μ λ§μΆ€ν νλ‘νμ λ±λ‘νκ³ , λμ κΈ°μ κΆν©μ΄ μ λ§λ κΈ°μ λ€μ λ§€μΉ λ°μΌμΈμ.
programmers.co.kr
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π€ BOJ16954 μμ§μ΄λ λ―Έλ‘ νμΆ (Java) (0) | 2021.03.08 |
---|---|
π 2019 μΉ΄μΉ΄μ€ λΈλΌμΈλ 곡μ±: νλ³΄ν€ (Java) (0) | 2020.05.03 |
π€ 2020 μΉ΄μΉ΄μ€ λΈλΌμΈλ 곡μ±: μλ¬Όμ μ μ΄μ (Java) (0) | 2020.04.28 |
π νλ‘κ·Έλλ¨Έμ€: Lv3. μ κ΅ μ¬μ¬ (Java) (0) | 2020.04.25 |
π μΉ΄μΉ΄μ€ 2019 κ²¨μΈ μΈν΄μ: λΆλ μ¬μ©μ(Lv3) (0) | 2020.04.05 |
π μΉ΄μΉ΄μ€ 2019 κ²¨μΈ μΈν΄μ: ν¬λ μΈ μΈνλ½κΈ° κ²μ(Lv2) (0) | 2020.04.01 |