[TIL] 자판기 알고리즘

Hailey Park·2022년 3월 17일
0

알고리즘

목록 보기
2/2

기업과제로 자판기 알고리즘을 구현해보았다.

Flow Chart

전제조건

  1. 사용자가 사용가능한 결제수단
    a. 현금 : 100원 / 500원 / 1,000원 / 5,000원 / 10,000원권 사용가능
    b. 카드 : 카드결제 가능
  2. 구매 가능한 음료수
    a. 콜라 : 1,100원
    b. 물 : 600원
    c. 커피 : 700원
  3. 발생 가능한 모든 상황에 대한 로직과 프로세스를 반영

로직 구현

  1. 반복문을 돌며
    • 재고가 없으면 음료 버튼이 활성화되지 않는다.
    • 투입 금액이 음료의 가격보다 적으면 음료 버튼이 활성화되지 않는다.
  2. 결제 수단이 카드인 경우,
    • 카드의 잔액이 음료의 가격보다 적을 경우 카드의 연결을 끊고 "카드의 잔액이 부족합니다" 메세지를 출력한다.
    • 카드의 잔액이 충분할 경우, 해당 음료의 재고 수량 데이터를 1 감소시키고 카드의 잔액에서 음료의 가격을 뺀 후 카드의 연결을 끊고 음료를 내보낸다.
  3. 결제 수단이 현금이 경우,
    • 투입 금액이 음료의 가격보다 적으면 "금액이 부족합니다" 메세지를 출력한다.
    • 투입 금액이 충분할 경우, 자판기 내 거스름 돈의 액수가 충분한 지 검사하고, 충분하지 않을 경우 "거스름돈이 부족합니다" 메세지를 출력한다. 자판기 내 거스름돈의 액수가 충분할 경우, 투입 금액에서 음료의 가격을 빼고 음료 재고 데이터의 수량을 1 감소시킨 후 음료와 남은 금액 데이터를 리턴한다.
    • 금액 반환 버튼을 누른 경우, 잔액이 없으면 "반환할 금액이 없습니다" 메세지를 출력한다. 잔액이 있으면, 자판기에 있는 금액을 계산해서 거스름돈을 내보낸다. 이 반환 버튼을 누르지 않은 경우, 이 조건문을 통과하지 않고 자판기 안에 잔액이 남아있게 되고, 그 잔액은 다음 번 함수 실행 초기에 더해진다.

🌟 코드 구현 시 내가 놓친 부분 🌟

  • 금액이 투입되었을 때, 자판기 내 금액에 투입된 금액의 데이터에 해당 금액의 권종별 갯수가 추가되어야 한다.
  • 카드는 제한 시간이 지나면 timeout으로 연결이 끊어져야 한다.

Pseudo-Code in a Python-like style

payment_method = [CASH, CARD]

price = [1100, 600, 700]
drink = ["coke", "water", "coffee"]

cash_type = [10000, 5000, 1000, 500, 100]
cash_output = {100 : 0, 500 : 0, 1000 : 0, 5000 : 0, 10000 : 0}

#최초 자판기 내부의 거스름돈 액수는 임의 지정
cash_balance = {100 : 100, 500 : 100, 1000 : 100, 5000 : 100, 10000 : 100}
#최초 자판기 내부의 음료 재고 개수는 임의 지정
drink_balance = {"coke_1" : 10, "coke_2" : 10, "coke_3" : 10, "coke_4" : 10,
        "water_1" : 10, "water_2" : 10, "water_3" : 10, "water_4" : 10
        "coffee_1" : 10, "coffee_2" : 10, "coffee_3" : 10, "coffee_4" : 10}

IF "coke" in INPUT("음료 선택") THEN
    drink_num = 0
ELSE IF "water" in INPUT("음료 선택") THEN
    drink_num = 1
ELSE "coffee" in INPUT("음료 선택") THEN
    drink_num = 2

input_balance = 0
input_amount = integer(INPUT("투입 금액"))


FUNCTION BalanceCheck(input_amount, drink_num)
    cash_amount = 0
    FOR key in cash_balance
        cash_amount += (cash_balance[key] * key)
    END FOR LOOP
    IF cash_amount > price[drink_num] THEN
        OUTPUT True
    ELSE
        OUTPUT False
    END IF
END FUNCTION


FUNCTION CashOutput(input_amount)
    FOR amount in cash_type
        WHILE input_amount > amount
            cash_output[amount] += 1
            input_amount -= amount
        END WHILE LOOP
    END FOR LOOP
    OUTPUT cash_output
END FUNCTION
    

FUNCTION VendingMachine(input_balance, input_amount, input_drink, payment_method)
    WHILE True
        input_amount += input_balance 
        FOR balance in drink_balance
            IF drink_balance[balance] != 0 THEN
                OUTPUT "음료 버튼 활성화"
            END IF input_amount > price[drink_num] THEN
                OUTPUT "음료 버튼 활성화"

        IF payment_method == CARD THEN 
            IF CARD_BALANCE < price[drink_num] THEN
								CARD_CONNECTION = False
                OUTPUT "카드의 잔액이 부족합니다."
            ELSE 
                CARD_BALANCE -= price[drink_num]
                drink_balance[input_drink] -= 1
                CARD_CONNECTION = False
                OUTPUT input_drink
            END IF
                
        ELSE 
            IF input_amount < price[drink_num] THEN
                OUTPUT "금액이 부족합니다."
            ELSE
                IF BalanceCheck(input_amount, drink_num) == False THEN
                    OUTPUT "자판기 내 거스름돈이 부족합니다"
                ELSE
                    input_amount -= price[drink_num]
                    input_balance = input_amount
                    drink_balance[input_drink] -= 1
                    OUTPUT [input_drink, input_balance]
                END IF 
            END IF
            
            IF INPUT("금액 반환 버튼") == True THEN
                IF input_balance == 0 THEN 
                    OUTPUT "반환할 금액이 없습니다."
                ELSE
                    cash_output = CashOutput(input_amount)
                    FOR amount in cash_type
                        cash_balance[amount] -= cash_output[amount]
                    END FOR LOOP
                    input_balance = 0
                    OUTPUT [cash_output, input_balance, cash_balance]
                END IF
            END IF
    END WHILE LOOP
END FUNCTION
profile
I'm a deeply superficial person.

0개의 댓글