통계 처리의 어려움
시간 제한1초메모리 제한128 MB
두 설문 문항의 교차표를 만들어 각 칸의 빈도와 행·열 비율을 고정된 6자 폭 표에 출력합니다.
문제
여러분의 팀은 국제 기업 ACM(Analytical Calculation Maxims)에 고용되었습니다. ACM은 해마다 다양한 설문을 설계하고 진행합니다. 설문은 여러 개의 질문과, 각 질문마다 고를 수 있는 답변 목록으로 이루어진 간단한 양식입니다. 설문은 전 세계로 배포되고, 현장 요원들이 대상 집단에게 질문합니다. 모든 답변은 ICPC(International Computation and Processing Center)로 모이며, 분석가 팀이 원자료에서 의미 있는 상관관계를 찾습니다. 하나의 설문에 대한 원자료는 여러 줄로 이루어지고, 각 줄은 질문받은 한 사람에 대응하며 그 사람이 각 질문에 답한 답변을 담고 있습니다.
여러분이 자동화해야 하는 분석의 첫 단계는, 관심 있는 두 질문의 답변 사이의 상관관계를 나타내는 교차표(cross table)를 만드는 것입니다. 가장 단순한 형태에서 교차표는 첫 번째 질문의 각 답변마다 한 행을, 두 번째 질문의 각 답변마다 한 열을 가집니다. 각 칸에는 두 질문의 해당 답변을 동시에 담고 있는 원자료 줄의 개수가 들어갑니다.
여러분의 과제는 이보다 복잡합니다. 단순한 교차표 값뿐 아니라, 각 행과 각 열의 합계(그 행이나 열의 값들의 합)를 추가된 마지막 열과 마지막 행에 출력해야 하고, 각 행과 각 열의 백분율 분포도 출력해야 합니다. 어떤 칸의 행 기준 백분율은 그 칸의 값이 그 행의 합계에서 차지하는 비율(퍼센트)이며, 다만 행의 합계가 0이면 그 행의 행 기준 백분율은 정의되지 않습니다. 열 기준 백분율도 열의 합계를 이용하여 같은 방식으로 정의됩니다. 따라서 각 칸에는 최대 세 개의 숫자, 즉 값 자체, 행 기준 백분율, 열 기준 백분율이 표시됩니다. 백분율은 합계에도 적용됩니다. 마지막(합계) 열에서 행 기준 백분율은 항상 100%이며(행의 합계가 0이면 정의되지 않음), 열 기준 백분율은 그 행의 합계가 전체 줄 수의 총합계(오른쪽 아래 칸의 값)에서 차지하는 비율을 나타냅니다.
출력 시 백분율은 다음의 결정적 규칙에 따라 정수로 반올림합니다. 각 정확한 백분율을 계산한 뒤 그 내림값(그 값보다 크지 않은 가장 큰 정수)을 취합니다. 합이 100%가 되어야 하는 백분율 묶음을 생각합니다. 행 기준 백분율에서는 합계 열을 제외한 한 행이, 열 기준 백분율에서는 합계 행을 제외한 한 열이 그 묶음입니다. 묶음의 내림값들의 합이 이면(즉 만큼 부족하면), 소수 부분이 0이 아닌 칸들 중에서 마지막 개의 칸에 정확히 1씩 더합니다. 이때 행에서는 왼쪽에서 오른쪽으로, 열에서는 위에서 아래로 살펴봅니다. 이미 정수인 백분율은 그대로 출력합니다. 해당 합계가 0이면 그 묶음의 모든 백분율은 정의되지 않습니다.
입력
입력은 설문 설명, 설문 결과, 교차표 설명의 세 부분으로 이루어집니다.
첫 줄은 설문 이름이며 최대 100자입니다. 이어지는 줄들은 질문을 설명합니다. 한 질문의 첫 줄은 3글자 질문 코드(대문자와 숫자만 사용), 공백 한 칸, 그리고 질문 이름(최대 80자)으로 이루어집니다. 그 질문의 답변을 설명하는 각 줄은 공백 한 칸으로 시작하고, 이어서 한 글자 답변 코드(대문자, 숫자, 또는 문자 ., *, @ 중 하나), 공백 한 칸, 그리고 답변 설명(최대 40자)이 옵니다. 질문 목록은 문자 # 하나만 있는 줄로 끝납니다. 답변 코드는 한 질문 안에서 서로 다르고, 질문 코드는 입력 전체에서 서로 다릅니다. 각 질문의 답변은 2개 이상 10개 이하이며, 질문은 2개 이상 100개 이하입니다.
다음 줄들은 설문 결과입니다. 각 줄은 질문이 나온 순서대로 질문마다 한 글자씩, 그 사람이 각 질문에 답한 답변 코드를 구분자 없이 담습니다. 이 부분은 문자 # 하나만 있는 줄로 끝납니다. 결과 줄은 최소 한 줄 있으며, 기록된 답변의 총 개수(결과 줄 수 × 질문 수)는 최대 10000입니다.
다음 줄들은 만들 교차표를 설명합니다. 각 설명은 한 줄로, 첫 번째 질문의 코드, 공백 한 칸, (서로 다른) 두 번째 질문의 코드, 공백 한 칸, 그리고 교차표 이름(최대 100자)으로 이루어집니다. 이 부분은 문자 # 하나만 있는 줄로 끝납니다. 교차표 설명은 최대 100개입니다.
어떤 줄에도 끝에 공백이 없습니다. 어떤 이름도 공백으로 시작하거나 끝나지 않지만, 이름 안에는 공백이 있을 수 있습니다.
출력
각 교차표 설명에 대해, 입력에 나온 순서대로 그 교차표를 출력에 씁니다.
교차표의 첫 줄에는 설문 이름, 공백 한 칸, -(붙임표), 공백 한 칸, 그리고 교차표 이름을 씁니다. 그다음 첫 번째 질문의 설명과 두 번째 질문의 설명을 입력에 나온 것과 똑같은 형식으로 그대로 씁니다. 이어서 빈 줄 하나를 쓰고, 그다음 표 자체를 씁니다.
표는 정확히 개의 줄로 이루어지고, 모든 줄은 정확히 개의 문자로 이루어집니다. 여기서 은 첫 번째 질문의 답변 개수, 는 두 번째 질문의 답변 개수입니다.
표에는 제목 줄 하나와, 각각 3줄로 이루어진 개의 행이 있습니다. 처음 개의 행은 입력 순서대로 첫 번째 질문의 답변에 대응하고, 마지막 행은 열 합계입니다. 표에는 개의 열이 있고 각 열의 너비는 6문자입니다. 첫 번째 열은 행 제목을 담고, 이어지는 개의 열은 입력 순서대로 두 번째 질문의 답변에 대응하며, 마지막 열은 행 합계를 담습니다. 모든 칸의 내용(제목 포함)은 오른쪽에 맞추고 왼쪽을 공백으로 채워 정확히 6문자 너비로 만듭니다.
첫 번째 열의 제목은 비어 있습니다. 이어지는 개 열의 제목은 두 번째 질문의 코드, :(콜론), 그리고 해당 답변 코드로 이루어집니다. 마지막 열의 제목은 TOTAL입니다. 처음 개 행의 제목은 첫 번째 질문의 코드, :(콜론), 그리고 해당 답변 코드로 이루어지고, 마지막 행의 제목은 TOTAL입니다. 행 제목은 그 행의 세 줄 중 첫 줄에 오고, 나머지 두 줄에서는 제목 열이 비어 있습니다.
제목이 아닌 각 칸에서 첫 줄에는 교차표 값을, 둘째 줄에는 행 기준 백분율을, 셋째 줄에는 열 기준 백분율을 씁니다. 각 백분율은 반올림한 정수 뒤에 반드시 % 문자를 붙여 쓰거나, 그 백분율이 정의되지 않으면 -(붙임표) 하나만 씁니다.
출력에서 연속한 교차표는 빈 줄 하나로 구분합니다.