ATM 기계 설계

3465 단어 theabbieleetcodedsa
5 액면가의 지폐를 보관하는 ATM 기계가 있습니다. 처음에는 ATM이 비어 있습니다. 사용자는 기계를 사용하여 원하는 금액을 입금하거나 인출할 수 있습니다.

인출 시 기계는 금액이 큰 지폐를 우선적으로 사용합니다.
  • 예를 들어 20를 인출하려고 하는데 50 100 지폐, 200 500 지폐, $300 2 지폐가 있으면 기계는 $50 지폐를 사용합니다. ) 및 1 지폐.
  • 단, $100 출금을 시도할 때 1 $200 지폐와 $100 $200 지폐가 있는 경우에는 기계가 $600 지폐를 먼저 사용하려고 하기 때문에 출금 요청이 거부됩니다. ) 지폐를 사용하고 남은 지폐를 완성하기 위해 지폐를 사용할 수 없습니다3. 기계는 $200 지폐 대신 1 지폐를 사용할 수 없습니다.

  • ATM 클래스를 구현합니다.
  • $500 ATM 개체를 초기화합니다.
  • $500 $100 , $200 , $500 , ATM()void deposit(int[] banknotesCount) 순서로 새 지폐를 입금합니다.
  • $20 $50 , $100 , $200 , $500 , int[] withdraw(int amount) 순으로 사용자에게 건네줄 지폐 갯수의 길이 5 배열을 반환합니다. 인출 후 ATM의 지폐 수를 업데이트합니다. 가능하지 않은 경우 $20를 반환합니다(이 경우 지폐를 인출하지 마십시오).

  • 예 1:

    입력
    ["ATM", "입금", "출금", "입금", "출금", "출금"]
    [[], [[0,0,1,2,1]], [600], [[0,1,0,1,1]], [600], [550]]
    산출
    [널, 널, [0,0,1,0,1], 널, [-1], [0,1,0,0,1]]

    설명
    ATM atm = 새 ATM();
    atm.deposit([0,0,1,2,1]);//$100 지폐 1장, $200 지폐 2장,
    //그리고 $500 지폐 1장.
    atm.withdraw(600);//[0,0,1,0,1]을 반환합니다. 기계는 $100 지폐 1장을 사용합니다.
    //그리고 $500 지폐 1장. 은행에 남겨진 지폐
    //머신은 [0,0,0,2,0]입니다.
    atm.deposit([0,1,0,1,1]);//$50, $200, $500 지폐 1개를 입금합니다.
    //기계의 지폐는 이제 [0,1,0,3,1]입니다.
    atm.withdraw(600);//[-1]을 반환합니다. 기계는 $500 지폐를 사용하려고 시도합니다.
    //나머지 $100를 완료할 수 없습니다.
    //철회 요청이 거부됩니다.
    //요청이 거부되었으므로 지폐의 수
    //기계에서 수정되지 않습니다.
    atm.withdraw(550);//[0,1,0,0,1]을 반환합니다. 기계는 $50 지폐 1장을 사용합니다.
    //그리고 $500 지폐 1장.

    제약:
  • $50
  • $100
  • $200
  • 최대 $500 호출은 [-1]banknotesCount.length == 5로 이루어집니다.
  • 각 함수0 <= banknotesCount[i] <= 1091 <= amount <= 109에 대해 최소 한 번 호출됩니다.

  • 해결책:

    from collections import defaultdict
    
    class ATM:
    
        def __init__(self):
            self.notectr = defaultdict(int)
    
        def deposit(self, banknotesCount: List[int]) -> None:
            for i in range(5):
                self.notectr[[20, 50, 100, 200, 500][i]] += banknotesCount[i]
    
        def withdraw(self, amount: int) -> List[int]:
            currnotectr = self.notectr.copy()
            for note in [500, 200, 100, 50, 20]:
                notesused = min(amount // note, currnotectr[note])
                amount -= notesused * note
                currnotectr[note] -= notesused
                if amount == 0:
                    break
            if amount != 0:
                return [-1]
            used = [self.notectr[note] - currnotectr[note] for note in [20, 50, 100, 200, 500]]
            self.notectr = currnotectr
            return used
    
    
    
    # Your ATM object will be instantiated and called as such:
    # obj = ATM()
    # obj.deposit(banknotesCount)
    # param_2 = obj.withdraw(amount)
    

    좋은 웹페이지 즐겨찾기