ν보ν€
λ¬Έμ
λ¬Έμ μ€λͺ
ν보ν€
νλ μ¦λνκ΅ μ»΄ν¨ν°κ³΅νκ³Ό μ‘°κ΅μΈ μ μ΄μ§λ λ€μ€ νκ³Όμ₯λμ μ§μλ‘, νμλ€μ μΈμ μ¬νμ μ 리νλ μ 무λ₯Ό λ΄λΉνκ² λμλ€.
κ·Έμ νλΆ μμ νλ‘κ·Έλλ° κ²½νμ λμ΄λ €, λͺ¨λ μΈμ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ£κΈ°λ‘ νμκ³ , μ΄λ₯Ό μν΄ μ 리λ₯Ό νλ μ€μ ν보ν€(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μ λͺ¨λ ννμ μ μΌνκ² μλ³ κ°λ₯νλ€.(μ¦, μ€λ³΅λλ ννμ μλ€.)
μ μΆλ ₯ μ
relation | result |
---|---|
[["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κ°μ΄λ€.
μ½λ
#include <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
bool compare(string a, string b) {
return a.length() < b.length();
}
int solution(vector<vector<string>> relation) {
int answer = 0;
int row = relation.size();
int column = relation[0].size();
vector<string> memorize;
vector<int> permutation;
for (int i = 0; i<column; i++)
permutation.push_back(i);
for (int i = 1; i <= column; i++) {
pair<set<string>::iterator, bool> ret;
vector<int> bitMap(column, 0);
for (int j = 0; j<i; j++) {
bitMap[j] = 1;
}
sort(bitMap.begin(), bitMap.end()); // next_permutationμ sortλμ΄μμ΄μΌνλ€λ κ² λͺ
μ¬!
do {
vector<int> columnNum;
for (int j = 0; j<column; j++) {
if (bitMap[j] == 1) {
columnNum.push_back(permutation[j]);
}
}
if (columnNum.size() == 0)
break;
int flag = 1;
set<string> stringSet;
for (int j = 0; j<row; j++) {
string tmpStr = "";
for (int k = 0; k<columnNum.size(); k++) {
tmpStr += relation[j][columnNum[k]];
}
ret = stringSet.insert(tmpStr);
if (ret.second == false) {
flag = 0;
break;
}
}
if (flag) {
string pair;
for (int j = 0; j<columnNum.size(); j++) {
pair += to_string(columnNum[j]);
}
flag = 1;
for (int j = 0; j < memorize.size(); j++) {
if (includes(pair.begin(), pair.end(), memorize[j].begin(), memorize[j].end())) { // ν¬ν¨λμ΄μλ€λ©΄
flag = 0;
break;
}
}
if (flag) {
memorize.push_back(pair);
}
}
} while (next_permutation(bitMap.begin(), bitMap.end()));
}
answer = memorize.size();
return answer;
}
νμ΄
μ°μ , μ λ ₯μ μ΅λκ°μ΄ 8μ΄κΈ° λλ¬Έμ columnμ λν μ‘°ν©μ μ°Ύμλ μκ°λ³΅μ‘λμλ μ΄μμ΄ μμμ νμΈνμλ€.
- columnμ μ‘°ν©μ μ°Ύμ.
- μ‘°ν©λ³λ‘ rowλ₯Ό νμνλ©°, uniqueν μ‘°ν©μ μ μ₯νμ.
- μ΄ λ, μ‘°ν©μ μ΅μμ±μ μ μ§ν΄μΌνλ―λ‘ λ€λ₯Έ μ‘°ν©μ λΆλΆμ§ν©μ΄ μλμ΄μΌνλ€.
μ΄λ¬ν μ¬κ³ κ³Όμ μ κ±°μ³μ λ¬Έμ λ₯Ό ν΄κ²°νμλ€. μμΈν νμ΄λ₯Ό μ΄ν΄λ³΄μ.
- columnμ μ‘°ν©μ μ°ΎκΈ° μν΄ next_permutation ν¨μλ₯Ό μ΄μ©νμλ€. next_permutation ν¨μμ bitmapμ μ΄μ©νλ©΄ μμ΄ν¨μλ‘ μ‘°ν©μ μ°Ύμ μ μλ€.
- uniqueν columnμ‘°ν©μ μ°ΎκΈ° μν΄μ row λ³λ‘ column μ‘°ν©μ ν΄λΉνλ κ°μ stringμΌλ‘ λ¬Άμ΄μ€ ν, set μλ£κ΅¬μ‘°λ₯Ό μ΄μ©ν΄μ μ€λ³΅ κ°μ΄ μλ column μ‘°ν©μ μ°Ύμλ€.
- λΆλΆμ§ν©μ νλ¨νλ λΆλΆμ includes ν¨μλ₯Ό μ΄μ©νμλ€.
μ±μ κ²°κ³Ό
μ£Όμμ¬ν
- μ΄λ€ μΉμ ν λΆμ΄ μ§λ¬ΈνκΈ°μ λ¨κ²¨μ£Όμ
¨λ―μ΄, stringμ ν¬ν¨νλμ§λ₯Ό λ¬Όμ λ find ν¨μλ₯Ό μ°λ©΄ λΆλΆμ§ν©κ΄κ³λ₯Ό μ‘μλ΄μ§ λͺ»νλ€.
- ex_ "abcd" μμ "ad"κ° ν¬ν¨λ¨μ λνλ΄λ €λ©΄
includes(str1.begin(), str1.end(), str2.begin(), str2.end())
ν¨μλ₯Ό μ¬μ©ν΄μΌν¨
- ex_ "abcd" μμ "ad"κ° ν¬ν¨λ¨μ λνλ΄λ €λ©΄
- next_permutationμ μ€λ¦μ°¨μ sortλμ΄μμ΄μΌνλ€λ κ² λͺ μ¬ν κ²
- κ°μ κ±Έ μ‘μλ΄λ €λ©΄ set μλ£κ΅¬μ‘°λ³΄λ€λ findλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€. => κ°μ idxλ μ°Ύμ μ μκΈ° λλ¬Έ
- idxκ° νμμμΌλ©΄ setμ μ°λ κ²μ΄ λ κ°νΈνλ€.
- 리ν΄κ°μμ 1λ²μ§Έ μΈμλ iterator, 2λ²μ§Έ μΈμκ° booleanμμ μμ§λ§μ.
Comment