프로그래머스 Lv2: 후보키

Steve·2021년 11월 13일
0

https://programmers.co.kr/learn/courses/30/lessons/42890?language=javascript

풀긴 풀었는데 부분집합을 만들 때 재귀로 푼 문제. 그렇지만 다른 사람의 풀이를 보고 비트연산의 간단함과 효율성에 감탄하고 bitmask라는 개념을 이용해 부분집합을 만드는 새로운 알고리즘을 배웠고, 다시 풀어보았다.

function solution(relation) {
    let row = relation.length;
    let col = relation[0].length;
    let count = 0;
    let bitMaskList = [];
  
    // 최소성 체크 함수
    function minimalityCheck(list, set){
        let size = list.length;
        for (let i = 0; i < size; ++i){
            // 비트 & 연산은 둘다 1일 때 1이 된다.
            // set 에 이미 사용한 특성이 담겨있다면 & 연산을 할 시
            // 기존의 특성이 나온다.
            if ((list[i] & set) === list[i]) return false;
        }
        list.push(set);
        return true;
    }
  
    for (let i = 0; i < (1 << col); ++i){
        // 1. bitmask 로 가능한 모든 부분집합을 만든다.
        let keySet = new Set();
        for (let r = 0; r < row; ++r){
            // tuple 을 만든 뒤 set 에 넣는다.
            let key = '';
            for (let j = 0; j < col; ++j) {
                if (i & (1 << j)) key += relation[r][j];
            }
            keySet.add(key);
        }
        // 2. 유일성과 최소성을 체크한다.
        if (keySet.size === row // 유일성
            && minimalityCheck(bitMaskList, i)) // 최소성
            count++;
    }
    return count;
}

profile
게임과 프론트엔드에 관심이 많습니다.

0개의 댓글