이런 대회를 한 번 여는 데 얼마나 많은 일이 필요한지 아는가? 강의실을 예약하고, 컴퓨터를 설치하고, 먹을 것을 사고, 상장을 인쇄하는 것도 그중 일부일 뿐이다. 1995년 첫 CTU 대회부터 지금까지 준비하는 사람들은 수많은 밤을 새웠고, 전부 여러분 같은 사람이 ICPC를 즐기라고 한 일이다.
그중에서도 문제 세트에 손이 가장 많이 간다. 지문만 쓴다고 끝나지 않고 정답 코드와 테스트 데이터까지 준비해야 한다. 그 일을 도와 달라. 온라인 뱅킹 문제에 쓸 테스트 입력이 필요하다. 뱅킹 프로그램이 하는 일은 다음과 같다.
뱅킹 프로그램은 여러 시나리오를 읽는다. 시나리오는 감독을 시작하는 시점에 존재하는 계좌 수 $A$가 적힌 줄로 시작하고, $0 < A \le 100$이다. 이어지는 $A$개의 줄에는 계좌 번호, 공백 하나, 그 계좌의 시작 잔액이 적혀 있다. 그 뒤의 모든 줄은 요청 하나이며, 한 시나리오의 요청은 $0$개 이상 $1000$개 이하이다.
| 명령 | 뜻 | 인자 |
|---|---|---|
create | 새 계좌를 만든다 | 새 계좌 번호 |
deposit | 계좌에 현금을 넣는다 | 계좌 번호, 금액 |
withdraw | 계좌에서 현금을 뺀다 | 계좌 번호, 금액 |
transfer | 두 계좌 사이로 송금한다 | 출금 계좌, 입금 계좌, 금액 |
시나리오의 마지막 요청 다음에는 end가 적힌 줄과 빈 줄 하나가 오고, 그다음 시나리오가 시작한다. $A$ 자리에 0이 적힌 줄이 나오면 입력 전체가 끝난다.
계좌 번호는 십진수 네 자리, 빗금, 그 계좌를 관리하는 은행 코드 한 자리로 이루어진다. 은행마다 코드가 다르다. 금액은 소수점 아래 두 자리를 정확히 갖는 음이 아닌 십진수이고, 10000.00 이하이며, 필요 없는 0을 앞에 붙이지 않으므로 1.00보다 작은 금액만 0으로 시작한다. 시작 잔액도 표기법은 같지만 상한이 없다.
뱅킹 프로그램은 요청마다 한 줄을 출력한다. 명령, 명령에 금액 인자가 있으면 그 금액, 콜론, 공백 하나, 그리고 처리 결과 순서다.
create: 같은 은행에 같은 번호의 계좌가 이미 있으면 결과는 already exists이다. 없으면 잔액 0.00으로 계좌를 만들고 ok를 출력한다.
create가 아닌 명령은, 인자로 받은 계좌 번호 중 존재하지 않는 것이 하나라도 있으면 결과가 no such account이다. 계좌가 모두 존재하면 아래 규칙을 따른다.
deposit: 결과는 언제나 ok이고, 금액을 잔액에 더한다.
withdraw: 잔액이 금액보다 작으면 결과는 insufficient funds이다. 그렇지 않으면 금액을 빼고 ok를 출력한다.
transfer: 두 계좌 번호가 은행 코드까지 같으면 결과는 same account이다. 그렇지 않고 출금 계좌 잔액이 금액보다 작으면 결과는 insufficient funds이다. 둘 다 아니면 돈을 옮기고, 두 계좌가 같은 은행이면 ok를, 다른 은행이면 interbank를 출력한다.
시나리오 하나가 끝날 때마다 end와 빈 줄 하나를 출력하고, 마지막 시나리오의 end 뒤에는 goodbye가 적힌 줄을 하나 더 출력한다.
주어진 출력을 뱅킹 프로그램이 그대로 찍게 만드는 입력을 만들면 된다. 같은 출력을 내는 입력은 아주 많으므로, 출력 항목에서 정해 둔 한 가지 형태로 적는다.
입력은 뱅킹 프로그램을 한 번 올바르게 실행한 출력 전체이므로, 그 출력을 내는 입력이 적어도 하나 존재한다. 시나리오 하나에 들어 있는 결과 줄은 $0$개 이상 $1000$개 이하이다.
주어진 출력을 그대로 만들어 내는 뱅킹 프로그램 입력을 아래 형태에 맞추어 출력한다.
시나리오의 결과 줄을 하나씩 요청 하나로 바꾼다. 아래 표에서 $v$는 결과 줄에 찍힌 금액을 글자 그대로 옮긴 것이고, $k$는 지금 시나리오에서 ok로 처리된 create 요청의 개수이며 이번 줄도 센다.
| 결과 줄 | 요청 |
|---|---|
create: already exists | create 1000/1 |
create: ok | create KKKK/3, KKKK는 $k$를 네 자리로 적은 것 |
deposit v: ok | deposit 1000/1 v |
deposit v: no such account | deposit 9999/9 v |
withdraw v: ok | withdraw 1000/1 v |
withdraw v: insufficient funds | withdraw 4000/1 v |
withdraw v: no such account | withdraw 9999/9 v |
transfer v: ok | transfer 1000/1 2000/1 v |
transfer v: interbank | transfer 1000/1 3000/2 v |
transfer v: same account | transfer 1000/1 1000/1 v |
transfer v: insufficient funds | transfer 4000/1 1000/1 v |
transfer v: no such account | transfer 9999/9 1000/1 v |
시나리오마다 계좌를 정확히 네 개 선언하고, 요청보다 먼저 다음 순서로 적는다.
| 계좌 줄 | 역할 |
|---|---|
1000/1 B | 돈이 들어 있는 유일한 계좌 |
2000/1 0.00 | 같은 은행 안에서 이루어지는 송금의 입금 계좌 |
3000/2 0.00 | 다른 은행으로 가는 송금의 입금 계좌 |
4000/1 0.00 | 잔액이 늘 모자라는 계좌 |
$B$는 위 요청들이 요구된 결과를 그대로 내는 잔액 중 가장 작은 값이다. 소수점 아래 두 자리를 정확히 붙이고, 필요 없는 0은 앞에 붙이지 않는다.
한 시나리오의 요청을 다 적으면 end와 빈 줄 하나를 출력하고, 마지막 시나리오 뒤에는 0이 적힌 줄을 출력한다.