총계정원장(general ledger)에 거래를 전기(posting)하는 초기 처리 단계 중 하나를 수행하는 프로그램을 작성하세요.
복식부기(double-entry bookkeeping)의 핵심 원칙은 모든 차변(debit)의 합이 모든 대변(credit)의 합과 같아야 한다는 것이며, 이는 각 거래마다 성립해야 합니다.
이 프로그램에서 양수는 차변, 음수는 대변을 나타냅니다. 예를 들어 2.00은 2달러 차변, -2.00은 2달러 대변입니다.
프로그램의 목적은 각 거래의 차변과 대변이 균형을 이루는지 확인하고, 균형이 맞지 않는 거래를 보고하는 것입니다.
입력은 두 부분으로 구성됩니다.
첫 번째 부분은 총계정원장의 계정 목록으로, 최대 100개의 계정이 한 줄에 하나씩 다음 형식으로 주어집니다.
nnnxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
여기서 nnn은 세 자리 계정 번호이고, xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx는 1자에서 30자 사이의 계정 이름 문자열입니다. 이 부분은 000으로 시작하는 레코드로 끝나며, 000은 계정 번호로 사용되지 않습니다.
두 번째 부분은 한 줄에 하나씩, 15자 길이의 레코드로 구성되며 형식은 다음과 같습니다.
sssnnnxxxxxxxxx
여기서 sss는 세 자리 일련번호, nnn은 세 자리 계정 번호, xxxxxxxxx는 소수점을 생략한 아홉 자리 금액(달러와 센트, 즉 센트 단위의 정수 값)입니다. 각 레코드는 한 거래의 한 항목이며, 하나의 거래는 동일한 일련번호를 가진 2개에서 10개의 항목으로 이루어집니다. 각 거래의 항목들은 입력에서 연속하여 나타납니다. 이 부분은 일련번호가 000인 레코드로 끝납니다.
차변과 대변이 균형을 이루는 거래에 대해서는 아무것도 출력하지 않습니다.
균형이 맞지 않는 거래에 대해서는 다음 형식의 예외 보고서를 출력합니다.
*** Transaction sss is out of balance ***
nnn xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx vvvvvvv.vv
nnn xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx vvvvvvv.vv
...
999 Out of Balance vvvvvvv.vv
여기서 nnn은 계정 번호, xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx는 해당 계정 이름, vvvvvvv.vv는 금액입니다. 각 줄은 다음과 같이 정렬합니다: 세 자리 계정 번호, 공백 한 칸, 30자 폭에서 왼쪽 정렬한 계정 이름, 공백 한 칸, 10자 폭에서 오른쪽 정렬한 금액. 항목은 입력에서 받은 순서대로 나열합니다.
보고서의 마지막 줄은 거래를 균형 맞추기 위해 직접 만드는 항목으로, 특별 계정 번호 999(가계정, suspense account)와 이름 Out of Balance를 사용하며, 그 금액은 나머지 항목들의 합을 상쇄하는 값입니다. 연속하는 예외 보고서 사이에는 빈 줄을 하나 넣습니다.