건강보험 플랜 비교

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

경쟁이 있는 민간 건강보험 시장에서는 환자가 자신에게 가장 잘 맞는 플랜을 고를 수 있다고 여겨진다. 하지만 실제로는 앞으로 어떤 진료가 필요할지 미리 예측하기 어렵고, 약관을 읽어 무엇이 보장되고 무엇이 보장되지 않는지 파악하는 일도 간단하지 않다. 이 문제에서는 여러 건강보험 플랜의 설명(보험료와 본인부담금)과 앞으로 1년간 예정된 병원 방문 목록이 주어진다. 각 플랜을 선택했을 때의 총비용을 계산해야 한다.

설명을 해석하는 규칙은 다음과 같다.

  • 문장은 항상 마침표 . 로 끝난다. 그 밖의 구두점(공백, 줄바꿈, 쉼표, 세미콜론)은 무시한다.
  • 대소문자가 섞여 있으며, 비교는 대소문자를 구분하지 않는다.
  • 텍스트에는 영문자, 숫자, 공백, 줄바꿈, 구두점 ., ,, ;, 그리고 문자 % 와 $ 만 등장한다. 모든 수는 정수이다.

설명에는 다음 정보가 담긴다.

  1. 플랜(plan). 한 문장에 단어 plan 이 있으면, 그 문장에서 plan 바로 다음 단어가 설명 대상 플랜의 이름이다. 그다음으로 plan 을 포함하는 문장이 나오기 전까지의 모든 정보는 그 플랜에 대한 것이다.
  2. 보험료(premium). 단어 premium 을 포함하는 문장에서, 앞이나 뒤에 달러 기호가 붙었거나 뒤에 단어 dollars 가 오는 정수가 그 플랜의 보험료(달러)이다. 그런 수는 정확히 하나뿐이다.
  3. 본인부담금(copayment 또는 copay). 단어 copayment 또는 copay 를 포함하는 문장에서는 다음과 같다.
    • 앞이나 뒤에 달러 기호가 붙었거나 뒤에 단어 dollars 가 오는 정수는 본인부담금의 최대 금액(달러)이며, 그보다 더 많이 청구되는 일은 결코 없다.
    • 뒤에 퍼센트 기호나 단어 percent 가 오는 정수는 실제 진료비에 대한 비율로 표현된 본인부담금이다.
    • 달러 금액과 백분율이 모두 주어지면, 본인부담금은 두 값 중 더 작은 쪽이다.
    • 본인부담금은 결코 진료비 자체를 초과할 수 없다. 예를 들어 본인부담금이 $100 이고 진료비가 $50 이면 $50 만 낸다.
  4. 회당(per visit) 대 총합(total). 본인부담금 문장은 각 방문마다 따로 적용되거나 모든 방문에 합쳐서 적용되며, 이는 문장에 per visit 또는 total 이 있는지에 따라 결정된다. 둘 다 없으면 총합(total)으로 본다. 둘 다 있으면 회당(per visit)으로 본다. (보험료에는 회당/총합 구분이 없다.)
  5. 각 문장은 premium 또는 copayment/copay 중 최대 하나만 포함하며, 단어 plan 도 최대 한 번만 포함한다.
  6. 보험료나 본인부담금이 명시되지 않으면 그 값은 0 이다.
  7. 한 플랜의 보험료나 본인부담금에 여러 값이 주어지면, 마지막으로 명시된 값을 사용한다.

플랜 설명 다음에는 병원 방문 목록이 주어지며, 각 방문은 그 진료비를 나타내는 하나의 정수로 표시된다. 각 플랜에 대해 총지출(보험료 + 본인부담금)을 구하는 것이 목표이다.

입력

첫 줄에 데이터 집합의 개수 K 가 주어진다. 이어서 K 개의 데이터 집합이 각각 다음 형식으로 주어진다.

  • 첫 줄에 두 정수 mn 이 주어진다 ($1 \le m, n \le 1000$).
  • 다음 m 개의 줄은 건강보험 플랜을 설명하는 텍스트이다. 각 줄은 최대 80자이다. 플랜은 항상 하나 이상 존재한다. 한 줄에 여러 문장이 있을 수 있고, 한 문장이 여러 줄에 걸칠 수도 있다.
  • 그다음 n 개의 줄에는 각각 정수 하나, 즉 한 번의 병원 방문 진료비가 주어진다.

출력

각 데이터 집합에 대해, 먼저 Data Set x: 를 한 줄에 출력한다. 여기서 x 는 데이터 집합의 번호(1부터 시작)이다. 그다음, 텍스트에서 처음 언급된 순서대로 각 플랜의 총지출(보험료 + 본인부담금)을 소수점 아래 두 자리로 반올림하여 한 줄에 하나씩 출력한다. 연속한 데이터 집합 사이는 빈 줄로 구분한다.