プログラマ候補鍵(level 2)


私の答え

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を使用して、重複する部分集合をすぐに除去するようです.私はずっと見ていますが、正直、コード自体を理解するのは難しいです.この問題自体が難しいためか、人々はそれぞれコードを書き、解答するのが難しい.でもやっぱり解けて気持ちがいい・・・