국제 대학생 프로그래밍 대회
시간 제한1초메모리 제한128 MB
은행 시뮬레이터의 출력이 주어졌을 때, 각 결과 줄을 정해진 요청으로 바꾸고 모든 요청이 성립하도록 가장 작은 초기 잔액 B를 골라 표준 형태의 입력을 복원한다.
문제
이런 대회를 한 번 여는 데 얼마나 많은 일이 필요한지 아는가? 강의실을 예약하고, 컴퓨터를 설치하고, 먹을 것을 사고, 상장을 인쇄하는 것도 그중 일부일 뿐이다. 1995년 첫 CTU 대회부터 지금까지 준비하는 사람들은 수많은 밤을 새웠고, 전부 여러분 같은 사람이 ICPC를 즐기라고 한 일이다.
그중에서도 문제 세트에 손이 가장 많이 간다. 지문만 쓴다고 끝나지 않고 정답 코드와 테스트 데이터까지 준비해야 한다. 그 일을 도와 달라. 온라인 뱅킹 문제에 쓸 테스트 입력이 필요하다. 뱅킹 프로그램이 하는 일은 다음과 같다.
뱅킹 프로그램은 여러 시나리오를 읽는다. 시나리오는 감독을 시작하는 시점에 존재하는 계좌 수 가 적힌 줄로 시작하고, 이다. 이어지는 개의 줄에는 계좌 번호, 공백 하나, 그 계좌의 시작 잔액이 적혀 있다. 그 뒤의 모든 줄은 요청 하나이며, 한 시나리오의 요청은 개 이상 개 이하이다.
시나리오의 마지막 요청 다음에는 end가 적힌 줄과 빈 줄 하나가 오고, 그다음 시나리오가 시작한다. 자리에 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가 적힌 줄을 하나 더 출력한다.
주어진 출력을 뱅킹 프로그램이 그대로 찍게 만드는 입력을 만들면 된다. 같은 출력을 내는 입력은 아주 많으므로, 출력 항목에서 정해 둔 한 가지 형태로 적는다.
입력
입력은 뱅킹 프로그램을 한 번 올바르게 실행한 출력 전체이므로, 그 출력을 내는 입력이 적어도 하나 존재한다. 시나리오 하나에 들어 있는 결과 줄은 개 이상 개 이하이다.
출력
주어진 출력을 그대로 만들어 내는 뱅킹 프로그램 입력을 아래 형태에 맞추어 출력한다.
시나리오의 결과 줄을 하나씩 요청 하나로 바꾼다. 아래 표에서 는 결과 줄에 찍힌 금액을 글자 그대로 옮긴 것이고, 는 지금 시나리오에서 ok로 처리된 create 요청의 개수이며 이번 줄도 센다.
시나리오마다 계좌를 정확히 네 개 선언하고, 요청보다 먼저 다음 순서로 적는다.
는 위 요청들이 요구된 결과를 그대로 내는 잔액 중 가장 작은 값이다. 소수점 아래 두 자리를 정확히 붙이고, 필요 없는 0은 앞에 붙이지 않는다.
한 시나리오의 요청을 다 적으면 end와 빈 줄 하나를 출력하고, 마지막 시나리오 뒤에는 0이 적힌 줄을 출력한다.