[Programmers] 후보키

Date:

[Programmers] 후보키

Problem URL : 후보키

#include<vector>
#include<map>
#include<string>

using namespace std;

vector<int> keys;

bool isMinimal(int value) {
    for (const int& i : keys) {
        if ((value & i) == i)
            return false;
    }
    return true;
}

int solution(vector<vector<string>> r) {
    int ans = 0;
    int row = (int)r.size(); 
    int column = (int)r[0].size(); 

    for (int i = 1; i < (1 << column); i++) {
        // 각각의 i에 대해 최소성이 만족하는지는
        // i보다 작은 모든 값들과 비교해서 isMinimal
        // 메소드로 확인해주면 된다.
        // 작은 i값부터 확인해서 keys에 넣어진다!
        if (!isMinimal(i)) {
            continue;
        }

        map<string, int> m;
        for (int j = 0; j < row; j++) {
            // 튜플의 key에 해당하는 속성값들
            string studentInfo = ""; 
            for (int k = 0; k < column; k++) {
                if (i & (1 << k)) {
                    studentInfo += r[j][k];
                }
            } 
            m[studentInfo]++;
            if (m[studentInfo] > 1) {
                break;
            }
        }

        if (m.size() == row) {
            keys.push_back(i);
        }
    }

    ans = (int)keys.size();
    return ans;
}

댓글