도서 검색 프로그램
시간 제한3초메모리 제한1024 MB
DB에 저장된 책 가운데 이름, 저자, 태그를 조건으로 한 중첩 검색식(A, O, N)을 모두 만족하는 책의 개수를 구합니다.
문제
게임개발동아리 PIMM에는 졸업생들이 전공책을 동아리방에 두고 가는 문화가 있다. 과거 PIMM은 신입 회원들이 중고 전공책을 자유롭게 쓸 수 있도록 도서 대여 시스템을 운영했다. 하지만 민규가 회장을 맡았던 작년에는 동아리방에 책이 너무 많이 쌓여 대여 시스템을 관리하기 어려워졌다. 이 소식을 들은 종현은 필요한 책을 바로 찾을 수 있는 도서 검색 프로그램을 만들기 시작했다.
종현이 만든 도서 검색 프로그램은 도서와 검색 요청을 각각 문자열로 저장한다. DB에는 도서를 뜻하는 문자열 <book>이 저장되며, 이 문자열은 배커스-나우르 표기법(BNF)에 따라 다음과 같이 표기될 수 있다. 표에서 "::=" 왼쪽에는 기호, 오른쪽에는 표현식이 온다.
<book> ::= <name> " " <author> | <name> " " <author> " " <tags>
<tags> ::= <tag> | <tag> " " <tags>
<name> ::= <str>
<author> ::= <str>
<tag> ::= <str>
이 표의 기호와 표현식은 다음과 같은 특성을 가진다.
<str>은 알파벳 대소문자, 숫자, '-', '_'로 이루어진 길이 이하의 문자열이다.<name>은 도서의 이름을 뜻한다.<author>는 도서의 저자를 뜻한다.<tag>는 도서가 가진 특징을 뜻한다.- 하나의
<tags>안에 중복된<tag>는 존재하지 않는다.
예를 들어 DB에 "1984 George_Orwell novel SF"라는 문자열 <book>이 있다면, 이름이 1984이고 저자가 George_Orwell이며 novel과 SF라는 두 가지 특징을 가진 도서가 검색 프로그램에 있다는 뜻이다.
DB에서 <name>과 <author>가 모두 같은 도서는 둘 이상 존재할 수 없다. 다만 <name>이나 <author> 중 하나만 같은 도서는 여러 권 있을 수 있다.
검색 요청 <search>도 문자열로 주어진다.
<method> ::= <AND> | <OR> | <NOT> | <nameCorrect> | <nameInclude> | <authorCorrect> | <tagCorrect>
<methods> ::= <method> | <method> ", " <methods>
<AND> ::= "A(" <methods> ")"
<OR> ::= "O(" <methods> ")"
<NOT> ::= "N(" <method> ")"
<nameCorrect> ::= "n:" <str>
<nameInclude> ::= "ni:" <str>
<authorCorrect> ::= "a:" <str>
<tagCorrect> ::= "t:" <str>
<search> ::= <methods>
이 표의 기호와 표현식은 다음과 같은 특성을 가진다.
<str>은 알파벳 대소문자, 숫자, '-', '_'로 이루어진 길이 이하의 문자열이다.<nameCorrect>는 표현식<str>이 주어진<book>의<name>과 일치하면 참을, 그렇지 않으면 거짓을 반환한다.<nameInclude>는 표현식<str>이 주어진<book>의<name>에 포함되면 참을, 그렇지 않으면 거짓을 반환한다.<authorCorrect>는 표현식<str>이 주어진<book>의<author>와 일치하면 참을, 그렇지 않으면 거짓을 반환한다.<tagCorrect>는 주어진<book>의<tags>안에<str>과 일치하는<tag>가 하나라도 있으면 참을, 그렇지 않으면 거짓을 반환한다.<AND>는<methods>안의 모든<method>가 참을 반환하면 참을, 그렇지 않으면 거짓을 반환한다.<OR>는<methods>안의<method>중 하나라도 참을 반환하면 참을, 그렇지 않으면 거짓을 반환한다.<NOT>은<method>가 참을 반환하면 거짓을, 그렇지 않으면 참을 반환한다.<search>는 DB 안의 모든<book>중<methods>안의 모든<method>가 참을 반환하는<book>의 개수를 반환한다.
입력
첫째 줄에 DB에 저장된 <book>의 개수 이 주어진다. 다음 개 줄에 <book>이 한 줄에 하나씩 주어진다.
다음 줄에는 검색 요청 <search>의 개수 이 주어진다. 다음 개 줄에 <search>가 한 줄에 하나씩 주어진다.
잘못된 문자열은 입력으로 주어지지 않는다.
출력
각 <search>에 대한 결괏값을 한 줄에 하나씩 출력한다.
제한
입력으로 주어지는 <book>의 길이는 이하이다.
입력으로 주어지는 <search>의 길이는 이하이다.
입력으로 주어지는 모든 수는 정수이다.