- μΉλ¦°μ΄
- λ€μ΅μ€νΈλΌ
- LCs
- μ¬λΌμ΄λ© μλμ°
- μΉ΄μΉ΄μ€2021
- DFS
- nestjs
- λΉνΈλ§΅
- μΉ΄μΉ΄μ€ μ½ν
- μ¬κ·
- μν°λ
- BFS
- js
- C++
- λ°±μ€
- golang
- μκ³ λ¦¬μ¦
- λ°±μλ ν리μ¨λ³΄λ©
- DP
- νΈλ¦¬
- λΉνΈλ§μ€νΉ
- κ°μ₯κ°κΉμ΄κ³΅ν΅μ‘°μ
- Python
- ν리μ¨λ³΄λ©
- μμ½λ
- Union-Find
- μ΄λΆνμ
- νλ‘κ·Έλλ¨Έμ€
- λμ νλ‘κ·Έλλ°
- go
- Today
- Total
Hello Ocean! πΌ
[νλ‘κ·Έλλ¨Έμ€/C++] νλ³΄ν€ λ³Έλ¬Έ
λ¬Έμ μ€λͺ
- κ΄κ³ λ°μ΄ν°λ² μ΄μ€μμ 릴λ μ΄μ
(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. ν κ°μ§ κ²½μ°μ μμ λν΄ν΄λΉ κ²½μ°μ μκ° ν보ν€κ° λλμ§ νλ³,
νλ³΄ν€ O -> ν΄λΉ κ²½μ°μ μκ° ν¬ν¨λλ λͺ¨λ κ²½μ°μ μ μ κ±°, answer++
νλ³΄ν€ X -> ν΄λΉ κ²½μ°μ μ μ κ±° (μ΄μ : μλ del_cases() μ€λͺ
μ°Έμ‘°)
μ΄λ κ² μ¨λκ³ λ³΄λ κ°λ¨ν κ² κ°κΈ°λ.. λ¨Έλ¦¬κ° μν λλ°..
ν¨μ
- combination()
- λͺ¨λ κ²½μ°μ μ μμ±μ μν ν¨μ
- cmp()
- λͺ¨λ κ²½μ°μ μλ₯Ό sortν λ κΈ°μ€μ΄ λλ ν¨μ
- is_candidate()
- ν΄λΉ κ²½μ°μ μκ° ν보ν€μΈμ§λ₯Ό νλ¨νλ ν¨μ
- μ£Όμ΄μ§ relationμμ ν΄λΉ columnλ€λ§ λͺ¨μ κ° rowλ³λ‘ νλμ stringμ λ§λ€μ΄ vectorμ λ΄κ³ , ν΄λΉ vectorμμ μ€λ³΅λ κ°μ μ κ±°ν νμ κΈΈμ΄κ° μλ rowμ κ°μμ κ°μΌλ©΄ ν보ν€μΈ κ²μΌλ‘ νλ³ (μ€λ³΅λ κ°μ΄ μλ€λ λ»)
- del_cases()
- ν΄λΉ ν보ν€κ° ν¬ν¨λλ λͺ¨λ κ²½μ°μ μλ₯Ό μ κ±°νλ ν¨μ
- μ¬κΈ°μμ all_casesλ₯Ό 맨 μλΆν° κ²μ¬νκΈ° λλ¬Έμ, λΆνμν μ°μ°μ νΌνκΈ° μν΄ ν보ν€κ° μλ κ²½μ°μ μλ₯Ό all_casesμμ λ°λ‘λ°λ‘ μμ ν΄μ€
μ½λ
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int row_n;
int cal_n;
vector<vector<int>> all_cases;
//κ°λ₯ν λͺ¨λ μ‘°ν© μμ±
void combination(int n = 0, vector<int> temp = {}) {
for (int i = n;i < cal_n;i++) {
temp.push_back(i);
all_cases.push_back(temp);
combination(i+1,temp);
temp.pop_back();
}
}
// all_cases μ λ ¬μ μν ν¨μ
bool cmp(vector<int> first, vector<int> second) {
if (first.size() == second.size()) {
for (int i = 0;i < first.size();i++) {
if (first[i] == second[i])
continue;
else if (first[i] > second[i])
return false; //secondκ° λ¨Όμ
else
return true; //firstκ° λ¨Όμ
}
}
else if (first.size() > second.size())
return false; //secondκ° λ¨Όμ
else
return true; //firstκ° λ¨Όμ
}
//ν΄λΉ columnμ μ‘°ν©μ΄ ν보ν€κ° λ μ μλμ§ νλ¨
bool is_candidate(vector<int> columns, vector<vector<string>> relation) {
vector<string> sets;
for (int i = 0;i < row_n;i++) {
string temp;
for (int j = 0;j < columns.size();j++) {
temp += relation[i][columns[j]] + " ";
}
sets.push_back(temp);
}
sort(sets.begin(), sets.end());
sets.erase(unique(sets.begin(), sets.end()), sets.end());
if (sets.size() == row_n)
return true;
return false;
}
//ν΄λΉ ν보ν€κ° λ€μ΄μλ λͺ¨λ κ²½μ°μ μ μμ
void del_cases(vector<int> candidate_key) {
vector<int> erase_index;
int count = 0;
for (int i = 0;i < all_cases.size();i++) {
bool flag = true;
for (int j = 0;j < candidate_key.size();j++) {
vector<int>::iterator iter;
iter = find(all_cases[i].begin(), all_cases[i].end(), candidate_key[j]);
if (iter == all_cases[i].end())
flag = false;
}
if (flag)
erase_index.push_back(i);
}
for (int i = 0;i < erase_index.size();i++) {
int e = erase_index[i] - count;
all_cases.erase(all_cases.begin() + e);
count++;
}
}
int solution(vector<vector<string>> relation) {
int answer = 0;
cal_n = relation[0].size();
row_n = relation.size();
combination(); // λͺ¨λ κ²½μ°μμ μμ±
sort(all_cases.begin(), all_cases.end(), cmp);
for (int i = 0;i < all_cases.size();i++) {
if (is_candidate(all_cases[i], relation)) {
del_cases(all_cases[i]);
i--;
answer++;
}
else {
all_cases.erase(all_cases.begin() + i);
i--;
}
}
return answer;
}
κ²°κ³Ό
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€/C++] κΈΈ μ°ΎκΈ° κ²μ (0) | 2021.01.25 |
---|---|
[C++/νλ‘κ·Έλλ¨Έμ€] λΈλ‘ μ΄λνκΈ° (0) | 2021.01.18 |
[νλ‘κ·Έλλ¨Έμ€/C++] ν¬λ μΈ μΈνλ½κΈ° κ²μ (0) | 2020.12.29 |
[νλ‘κ·Έλλ¨Έμ€] λ±κ΅£κΈΈ (0) | 2020.12.28 |
[νλ‘κ·Έλλ¨Έμ€/μΉ΄μΉ΄μ€ μ½ν ] μ€νμ±ν λ°© (0) | 2020.11.22 |