プログラマ候補鍵(level 2)
8870 ワード
私の答え
function solution(relation) {
var answer = [];
let len = relation[0].length;
let tmp = [];
function findCombi(arr) {
for (let x of answer) {
if(x.every(y => arr.includes(y))) return;
}
let map = new Map();
for (let i = 0; i < relation.length; i++) {
let key = "";
for (let x of arr) {
key += relation[i][x];
}
if (map.has(key)) {
break;
} else {
map.set(key, 1);
}
if (i === relation.length-1) answer.push(arr.slice(''));
}
}
function dfs(n, l, s) {
if (l === n) {
findCombi(tmp);
return;
}
for (let i = s; i < len; i++) {
tmp[l] = i;
dfs(n, l+1, 1+i);
}
}
for (let i = 1; i <= len; i++){
dfs(i,0,0);
}
return answer.length;
}
解くのに本当に時間がかかりました.1時間以上かかったようです.まず、組合せを作成する関数を作成し、繰り返し文で関数を呼び出します.結合を作成する関数で数に応じて選択するとfindCombiという関数が呼び出されます.findCombiは、作成した組合せが以前の組合せを完全に含んでいないため、関数を返します.そうでなければ、マッピングを作成し、選択した要素を文字列に接続し、キーでマッピングに設定します.オーバーラップした瞬間にbreakが終了し、オーバーラップしなければ候補鍵に選ばれる.他人の解答
他の人はsetを使用して、重複する部分集合をすぐに除去するようです.私はずっと見ていますが、正直、コード自体を理解するのは難しいです.この問題自体が難しいためか、人々はそれぞれコードを書き、解答するのが難しい.でもやっぱり解けて気持ちがいい・・・
Reference
この問題について(プログラマ候補鍵(level 2)), 我々は、より多くの情報をここで見つけました https://velog.io/@htogether7/프로그래머스-후보키-level-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol