문제
체크 카드를 사용할 때 가장 중요한 것은 결제가 항상 가능하도록 계좌 잔고를 항상 채워둬야 한다는 점이다.
어느 체크 카드는 deposit, pay, reservation 의 세 가지 기능을 가지고 있다.
- deposit : 주어진 금액만큼 계좌에 돈이 들어온다.
- pay : 주어진 금액만큼 계좌에서 돈이 결제된다. 단, 계좌의 현재 잔액이 주어진 금액보다 적다면 결제되지 않는다.
- reservation : 주어진 금액만큼 계좌에서 돈이 결제된다. 단, 계좌의 현재 잔액이 주어진 금액보다 적거나, 대기 목록에 다른 거래가 있다면 결제되지 않고 대기 목록의 맨 뒤에 추가된다.
- 대기 목록에 있는 거래들은 대기 목록에 들어간 순서대로 결제가 가능해지는 즉시 해당 거래의 금액만큼 계좌에서 금액이 차감된 뒤 대기 목록에서 삭제된다.
처음 계좌에 들어있던 금액과 지난 달 거래 내역이 주어졌을 때, 주어진 모든 거래가 진행된 뒤에 계좌에 남아있는 금액을 출력하시오. 거래가 완료되지 않고 대기 목록에 남아있는 경우도 거래가 진행된 것으로 본다.
입력
첫째 줄에는 처음에 계좌에 들어있던 잔액 N과 지난 달 거래 횟수 M이 공백을 두고 주어진다.
다음 M개의 줄에는 거래 내역이 시간 순서대로 주어진다. 거래 내역은 유형(deposit, pay, reservation)과 금액이 공백을 두고 주어진다.
- 0 ≤ N ≤ 100,000
- 1 ≤ M ≤ 10,000
- 거래 유형은 deposit, pay, reservation 세 문자열 중 하나로 주어진다.
- 거래 금액은 1 이상 100 이하의 정수이다.
- 입력에서 주어지는 모든 수는 정수이다.
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
reservationList = []
for _ in range(m):
transactionList = list(input().split())
if transactionList[0] == "deposit":
n += int(transactionList[1])
while len(reservationList) and n >= reservationList[0]:
n -= reservationList.pop(0)
elif transactionList[0] == "reservation":
if n < int(transactionList[1]) or len(reservationList) != 0:
# reservationList 길이가 0이 아닌 경우 = 현재 거래요청보다 먼저 거래가 되어야 할 목록이 있다는 뜻
reservationList.append(int(transactionList[1]))
continue
n -= int(transactionList[1])
elif transactionList[0] == "pay":
if n >= int(transactionList[1]):
n -= int(transactionList[1])
reservation 조건에서 언제 대기 목록에 있는 금액을 차감해야 하는가를 좀 헷갈려 했다.
그런데 어짜피 대기 목록에 들어갔다는 것은 "현재 잔액이 부족" 이니 deposit으로 거래가 가능해지는 금액이 되면 결제 되도록 구현했다.
※출처
https://multicampus-kdt.goorm.io/lecture/38996/멀티잇-코딩테스트-러닝클래스-python-6월반