[백준 14569번 C/C++] 시간표 짜기

 

https://www.acmicpc.net/problem/14569

 


 

 

해결전략

 

비트마스킹 Bitmasking


 

 

정답코드

 

#include <iostream>
#include <vector>
using namespace std;

int n; // 총 과목의 수
int m; // 학생의 수
vector<unsigned long long> lectures;  // 각 과목의 시간표를 비트마스크로 저장할 벡터

// 시간표를 비트마스크로 변환하는 함수
unsigned long long ConvertToBitmask(const vector<int>& times)
{
    unsigned long long binary = 0;

    for (int i = 0; i < times.size(); i++){
        binary |= (1ULL << times[i]); // 해당 시간에 대응하는 비트를 1로 설정
    }

    return binary;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n;
    lectures.resize(n);
    for (int i = 0; i < n; i++)
    {
        int k; // 각 과목의 수업시간의 수
        cin >> k;
        vector<int> times(k);
        for (int j = 0; j < k; j++){
            cin >> times[j];
        }
        lectures[i] = ConvertToBitmask(times); // 수업시간을 비트마스크로 변환하여 저장
    }

    cin >> m; // 학생 수
    for (int i = 0; i < m; i++)
    {
        int p; // (각 학생 당) 비어 있는 교시 개수
        cin >> p;
        vector<int> students(p);
        for (int j = 0; j < p; j++){
            cin >> students[j];
        }

        unsigned long long studentBitmask = ConvertToBitmask(students);

        int cnt = 0; // 학생이 들을 수 있는 과목의 수
        for (int j = 0; j < lectures.size(); j++)
        {
            // 학생의 비어 있는 교시와 과목의 수업시간을 비교하여 학생이 들을 수 있는지 확인
            if ((studentBitmask & lectures[j]) == lectures[j]) {
                cnt++;
            }
        }

        cout << cnt << "\n"; // 각 학생이 들을 수 있는 과목의 수 출력
    }

    return 0;
}