연세대학교 수강신청 기간이 시작되었다. 많은 친구들은 비어 있는 시간에 어떤 과목을 추가로 신청할 수 있는지를 궁금해 한다.
이 친구들이 비어 있는 시간에 추가로 신청할 수 있는 과목의 후보 개수를 구해보자.
후보 개수를 세는 것이므로 현재 내 시간표에서 신청할 수 있는 과목끼리 시간이 겹치더라도 모두 세어야 한다.
즉, 월요일 1, 2, 3, 4, 5교시 시간이 비어 있고 한 과목의 시간이 월요일 1, 2, 3, 4교시이고 나머지 한 과목의 시간이 월요일 2, 3, 4, 5교시라면 2과목 모두 후보가 될 수 있다.
연세대학교의 총 과목의 수 N (3 ≤ N ≤ 1000)이 주어진다.
N줄에 걸쳐서 각 과목의 수업시간의 수 k (4 ≤ k ≤ 50)가 주어지고 그 옆에 k개의 숫자 ti (1 ≤ ti ≤ 50)가 공백으로 구분되어 주어진다.
ti는 이 과목의 수업이 진행되는 교시를 의미하며 1 ~ 50의 값을 가진다.
(월요일 1~10교시: 1~10, 화요일 1~10교시: 11~20, …)
다음 줄에 학생수 M (1 ≤ M ≤ 10000) 이 주어진다.
M줄에 걸쳐서 각 학생들의 비어 있는 교시 개수 p (0 ≤ p ≤ 50)가 주어지고 그 옆에 p개의 숫자 qi (1 ≤ qi ≤ 50)가 공백으로 구분되어 주어진다.
Ex) 알고리즘의 수업시간이 화요일 2, 3교시, 수요일 4, 5교시라면 다음과 같이 입력이 주어진다.
4 12 13 24 25
M줄에 걸쳐서 각 학생들의 들을 수 있는 과목 개수를 출력한다.
3
4 1 2 3 4
6 5 6 7 8 9 10
4 11 21 31 41
5
8 1 2 3 4 5 6 7 8
7 1 2 3 7 8 9 10
14 1 2 3 4 5 6 7 8 9 10 11 21 31 41
5 41 42 43 44 45
10 1 5 6 7 8 9 10 11 21 31
1
0
3
0
1
const fs = require('fs');
let [N, ...input] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
N = Number(N);
let index = 0;
let classList = [];
for (let i = 0; i < N; i++) {
let timetable = input[index++].trim().split(' ').map(Number);
classList.push(timetable.splice(1));
}
let M = Number(input[index++]);
let answer = [];
for (let i = 0; i < M; i++) {
let empty = input[index++].trim().split(' ').map(Number);
let count = 0;
empty.splice(0, 1);
for (let j = 0; j < N; j++) {
if (classList[j].every((value) => empty.includes(value))) {
count++;
}
}
answer.push(count);
}
console.log(answer.join('\n'));
every로 쉽게 풀리는 문제였다. 좀 더 빡빡했다면...? 어려웠을지도