시간 제한
메모리 제한
시간 제한
1초
메모리 제한
128 MB
모든 고객은 새롭거나 낯선 제품 때문에 가끔 도움이 필요하므로, 핫라인 서비스는 어느 회사에나 중요하다. 이상적으로는 고객이 언제든 전화하면 무엇이든 친절하게 도와줄 목소리를 만날 수 있는 하나의 전화번호가 있으면 좋다. 그러나 이런 핫라인을 운영하려면 많은 상담원이 필요하고 인건비는 비싸다. 게다가 새벽 4시에 술 취한 고객에게 국회의사당 전화번호는 정말 알려줄 수 없다고 설명하면서 친절한 목소리를 유지하기란 쉽지 않다. 더구나 많은 질문이 반복되며, 같은 답을 계속 되풀이하는 일은 지겹다.
한 현대적인 회사는 가장 흔한 질문에 자동으로 답하는 소프트웨어를 만들어 핫라인 문제를 해결하려 한다. 고객의 음성은 음성 인식 모듈(VRM)이 분석하여 평범한 텍스트로 바꾼다. 그 텍스트는 다시 인공 자동 적응 응답 알고리즘(AAAAA)이 처리한다. 흔한 질문은 자동으로 인식되어 답변되고, 그 답변은 음성 합성 모듈(TTS)이 다시 소리로 바꾼다.
당신이 할 일은 AAAAA 모듈을 구현하는 것이다. 이 모듈은 적응적이어야 하므로 미리 정해진 지식 베이스가 없다. 대신 영어 문장을 듣고 진술된 사실을 기억하며, 그 사실에 대한 질문이 들어오면 올바르게 답해야 한다. VRM과 TTS 모듈은 이미 구현되어 있으므로 AAAAA 모듈의 입력과 출력은 모두 평범한 텍스트이다.
입력의 첫 줄에는 뒤따르는 대화의 개수를 나타내는 양의 정수 T가 하나 주어진다. 각 대화는 0개 이상의 줄로 이루어지며, 각 줄에는 진술 또는 질문인 문장이 하나씩 들어 있다. 진술은 마침표(.)로 끝나고 질문은 물음표(?)로 끝난다. 같은 진술은 두 번 이상 나타나지 않지만 질문은 반복될 수 있다. 각 대화 뒤에는 느낌표(!)로 끝나는 줄이 하나 더 온다.
문장에는 단어, 공백, 그리고 문장 부호(쉼표, 콜론, 세미콜론 등)가 들어갈 수 있다. 모든 단어는 영어 알파벳 글자만 사용하며 대소문자를 구분하므로, 같은 단어는 항상 같은 방식으로 (보통 소문자로) 표기된다. 약어, 이름 등 일부 단어는 대문자로 시작할 수 있다. 편의를 위해 모든 문장은 소문자로 시작하되, 첫 단어가 반드시 대문자여야 할 때만 대문자로 시작한다. 단어 사이에 불필요한 공백은 없고, 어떤 줄도 100자를 넘지 않으며, 한 테스트 케이스당 진술은 최대 100개이다.
각 진술은 다음 두 형태 중 하나이다.
subject predicate[s][ object].subject don't|doesn't predicate[ object].대괄호는 생략 가능한 부분을, 세로줄은 두 가지 대안을 나타낸다. subject(주어)는 한 단어로, 명사 또는 단수 대명사이다. predicate(서술어)는 어떤 활동을 나타내는 한 단어짜리 동사이다. object(목적어)는 임의의 텍스트일 수 있으며 마침표를 포함하지 않는다. "동사 + 목적어" 쌍은 각각 하나의 고유한 활동을 정의한다. 같은 동사라도 목적어가 다르면 서로 다른, 독립된 활동을 뜻한다. 목적어가 없는 문장은 목적어가 빈 문자열인 문장으로 취급하며, 목적어가 없는 동사는 목적어가 있는 같은 동사와는 다른, 독립된 뜻을 가진다.
첫 번째 형태는 긍정 진술이다. "predicate[s]"에서 동사는 주어에 일치한다. 주어가 "I" 또는 "you"이면 동사는 원형이고, 그 밖의 주어에는 "s"가 붙는다. 불규칙 동사는 없다고 가정한다.
두 번째 형태는 부정 진술이다. 조동사 "don't" 또는 "doesn't" 역시 주어에 일치해야 한다. "I" 또는 "you"에는 "don't"를, 그 밖에는 "doesn't"를 쓴다.
특별한 총칭 주어 "everybody"는 그 활동이 모든 주어에 대해 성립함을 뜻하고, 또 다른 총칭 주어 "nobody"도 모든 주어에 적용되지만 부정의 의미를 가진다. 두 총칭 주어는 첫 번째 형태로만 쓰인다("doesn't"와 함께 쓰이지 않는다). 문장 "nobody likes something"은 "everybody doesn't like something"과 정확히 같지만, 뒤의 형태는 입력에 결코 나타나지 않는다.
각 대화마다 Dialogue #D: 줄을 출력한다. 여기서 D는 1부터 시작하는 대화의 순번이다. 그런 다음 각 질문마다 정확히 세 줄을 출력한다. 첫 줄은 질문을 그대로 반복하고, 둘째 줄은 답이며, 셋째 줄은 빈 줄이다. 진술에 대해서는 아무것도 출력하지 않는다. 대화가 끝나면 입력에 있던, 느낌표로 끝나는 그 줄을 그대로 출력하고, 이어서 빈 줄을 하나 더 출력한다. 빈 줄은 개행 문자만 담는다.
답은 TTS 모듈이 읽을 수 있도록 형식을 갖춰야 한다. 답을 만들 때는 그 질문보다 앞에 나온 진술만 사용한다. 알려진 진술들이 서로 모순되면 답은 항상 I am abroad.이다. 질문이나 진술이 특별한 주어 "you"를 쓰면 답에서는 "I"로 바뀌고, 특별한 주어 "I"를 쓰면 답에서는 "you"로 바뀐다. 동사는 항상 문장의 주어에 일치해야 한다. 답의 정확한 형태는 질문의 종류에 따라 달라진다.
해당 주어(또는 총칭 주어 "everybody")와 주어진 서술어, 목적어에 대한 긍정 진술이 있으면 답은 다음과 같다.
yes, subject predicate[s][ object].해당 주어(또는 총칭 주어 "nobody")와 주어진 서술어, 목적어에 대한 부정 진술이 있으면 답은 다음과 같다.
no, subject don't|doesn't predicate[ object].그 밖의 경우 답은 maybe.이다.
답의 주어는 항상 질문의 주어와 같다.
어떤 주어로든 주어진 서술어와 목적어에 대한 긍정 진술이 있으면 답은 다음과 같다.
subject predicate[s][ object].그 활동에 일치하는 주어가 둘 이상이면 답의 주어를 그 모두로 바꾸되, 해당 진술이 나타난 순서대로 나열한다. 주어들은 쉼표와 공백으로 구분하고, 마지막 두 주어는 단어 "and"로 구분한다. 일치하는 주어 중에 "everybody"가 있으면 나머지는 나열하지 않고 "everybody"만 출력한다. 나열된 주어가 둘 이상이면 동사는 복수형(끝에 "s" 없음)이 되고, 그렇지 않으면 그 하나의 주어에 일치한다.
subject1, subject2 and subject3 predicate[ object].총칭 주어 "nobody"와 주어진 서술어, 목적어에 대한 부정 진술이 있으면 답은 다음과 같다.
nobody predicates[ object].그 밖의 경우 답은 I don't know.이다.
해당 주어(또는 총칭 주어 "everybody"나 "nobody")에 대한 진술이 (긍정이든 부정이든) 하나 이상 있으면, 그 진술들의 모든 동사와 목적어가 해당 진술이 나타난 순서대로 답에 나와야 한다. 동일한 동사-목적어 쌍은 두 번 이상 나올 수 없다(이후의 반복은 건너뛴다). 동사-목적어 쌍은 쉼표와 공백으로 구분하고, 마지막 동사 앞에는 쉼표와 단어 "and"를 둔다. 위에서 주어를 구분할 때와 달리 여기서는 쉼표가 붙는 점에 유의하라. 부정 항목은 "don't" 또는 "doesn't"를 사용해 진술의 형태를 그대로 유지한다.
subject[ don't|doesn't] predicate1[s][ object1],[ don't|doesn't] predicate2[s][ object2], and[ don't|doesn't] predicate3[s][ object3].subject[ don't|doesn't] predicate1[s][ object1], and[ don't|doesn't] predicate2[s][ object2].subject[ don't|doesn't] predicate[s][ object].그 밖의 경우 답은 I don't know.이다.
subject predicate[s][ object].subject don't|doesn't predicate[ object].yes, subject predicate[s][ object].no, subject don't|doesn't predicate[ object].subject predicate[s][ object].subject1, subject2 and subject3 predicate[ object].nobody predicates[ object].subject[ don't|doesn't] predicate1[s][ object1],[ don't|doesn't] predicate2[s][ object2], and[ don't|doesn't] predicate3[s][ object3].subject[ don't|doesn't] predicate1[s][ object1], and[ don't|doesn't] predicate2[s][ object2].subject[ don't|doesn't] predicate[s][ object].