거래 한도 검사
면접 대비시간 제한1초메모리 제한128 MB
은행 고객, 계좌, 거래 레코드를 파싱해 소유권과 거래 종류별 일일 한도를 확인하고 각 지시에 대한 결과를 출력하는 문제입니다.
문제
한 은행에서는 고객이 의도한 것보다 훨씬 큰 금액을 실수로 송금하는 일을 막기 위해 거래 한도를 적용하려고 한다.
각 거래는 한 계좌에서 다른 계좌로 돈을 보내는 요청이다. 거래에는 두 종류가 있다.
- 같은 고객이 소유한 두 계좌 사이의 이체는 계좌 간 이체(IAT)이다.
- 다른 고객이 소유한 계좌로 보내는 거래는 일반 지급(payment)이다.
각 고객은 거래 종류별로 다음 두 가지 한도를 지정한다.
- 1회 지시 한도: 한 번의 거래에서 허용되는 최대 금액
- 일일 노출 한도: 같은 날짜에 성공한 같은 종류의 거래 총액으로 허용되는 최대 금액
한도는 다음 규칙으로 적용된다.
- 거래 금액이 적용되는 1회 지시 한도를 초과하면 그 거래는 실패한다.
- 같은 고객이 같은 날짜에 이미 성공시킨 같은 종류 거래의 합계에 이번 거래 금액을 더했을 때 적용되는 일일 노출 한도를 초과하면 그 거래는 실패한다. 실패한 거래는 합계에 더하지 않으므로, 이후 더 작은 금액의 거래는 성공할 수 있다.
이 한도를 적용하여 각 거래 지시의 결과를 출력하는 프로그램을 작성하라.
입력
입력의 각 줄은 쉼표로 구분된 여러 필드로 이루어진 은행 기록이다. 첫 번째 필드가 기록의 종류를 나타낸다.
1기록은 고객 기록이며 6개의 필드를 가진다. 두 번째 필드는 고객 이름이고, 정확히 8개의 대문자로 이루어진다. 나머지 네 필드는 순서대로 그 고객의 IAT 1회 지시 한도, IAT 일일 노출 한도, 일반 지급 1회 지시 한도, 일반 지급 일일 노출 한도이다.2기록은 계좌 기록이며 3개의 필드를 가진다. 세 번째 필드는 정확히 6개의 숫자로 된 계좌 번호이다. 이 기록은 두 번째 필드의 고객이 해당 계좌를 소유함을 뜻한다.5기록은 거래 지시 기록이며 6개의 필드를 가진다. 두 번째부터 여섯 번째 필드는 거래 일시(YYYYMMDDhhmmss), 거래를 요청한 고객, 출금 계좌, 금액, 입금 계좌이다.9기록은 입력의 끝을 나타내며 필드가 하나뿐이다.
모든 금액은 달러와 센트 값이며, 소수점과 정확히 두 자리의 센트로 쓰인다. 자릿수 구분 쉼표는 쓰지 않는다. 최대 금액은 $9,999,999.99이다. 모든 1 기록이 먼저 나오고, 그다음 모든 2 기록, 그다음 모든 5 기록이 나오며, 마지막에 9 기록이 나온다.
2 또는 5 기록에 나오는 고객 이름은 모두 유효하며 정확히 하나의 1 기록에 등장한다. 5 기록에 나오는 계좌 번호도 모두 유효하며 정확히 하나의 2 기록에 등장한다. 5 기록은 거래 일시가 증가하는 순서로 주어진다. 고객은 최대 50명, 계좌는 최대 200개이다.
은행은 23:00부터 06:00까지의 거래를 받지 않으므로, 입력에는 이 시간대의 거래가 나오지 않는다.
출력
각 5 기록마다 한 줄을 출력한다. 각 줄은 INSTRUCTION n: 으로 시작해야 하며, 여기서 n은 1부터 시작하는 거래 지시 번호이다. 그 뒤에는 다음 메시지 중 정확히 하나를 붙인다.
- 출금 계좌가 거래를 요청한 고객의 소유가 아니면
NOT OWNER - 거래 금액이 적용되는 1회 지시 한도를 초과하면
IAT MAX EXCEEDED또는PAYMENT MAX EXCEEDED - 거래 금액을 더했을 때 적용되는 일일 노출 한도를 초과하면
IAT DEL EXCEEDED또는PAYMENT DEL EXCEEDED - 거래가 성공하면
IAT OK또는PAYMENT OK
한 거래가 두 한도 검사를 모두 실패하는 경우에는 해당하는 MAX EXCEEDED 메시지만 출력한다.