Python을 이용한 동작 알고리즘

김동주·2024년 1월 26일
post-thumbnail

🚩 프로젝트

기존의 만들었던 CoffeeMachin.py 파일을 이용하여 알고리즘 변경

📁 프로젝트 설명

제한 사항(Constrain)
- 커피 자판기에 보유된 총 금액이 5000원이다.
- 커피 자판기에 보유된 총 커피 개수는 10개이다.
- 커피 한개의 개수는 300원이다.

속성과 메소드
1) 속성(Properties)
- total_amount 		: 자판기가 가지고 있는 총 커피 개수
- total_amount_price 	: 자판기가 가지고 있는 총 금액
- coffee_price 		: 커피 한개의 가격(EX: 300원)
- req_coffee_nums	: 원하는 커피 개수
- remaining_price	: 돌려줄 금액(거스름 돈)

2) 메소드(Method)
- requtest() method	: 사용자로 부터 돈과 원하는 커피 개수를 입력 받는 동작
- get(넣은 돈, 커피 개수) method : 커피를 뽑는 동작
- info() method 		: 자판기에 남은 돈과 남아 있는 커피 개수 출력
- check_amount() method	: 현채 자판기에 남은 돈과 남아 있는 커피 개수 점검

3) 동작 정의
- 사용자에게 입력을 받는다.(넣은 돈, 커피 개수)
- 돈을 충분히 넣은 경우(EX: 700원, 2개 요청)
	* 거스름 돈이 있는 경우(EX: 700원, 2개 요청)
		* 자판기 커피 보유 총 개수에서 줄임
		* 자판기 총 금액에서 줄이고, 거스름 돈을 돌려줌
	* 거스름 돈이 없는 경우(EX: 600원, 2개 요청)
		* 자판기 커피 보유 총 개수에서 줄임
* 돈을 반정도 넣은 경우(EX: 500원, 2개 요청)
	* 거스름 돈이 있는 경우(EX: 500원, 2개 요청)
		* 자판기 커피 보유 총 개수에서 줄임
		* 자판기 총 금액에서 줄이고, 거스름 돈을 돌려줌
	* 거스름 돈이 없는 경우(EX: 300원, 2개 요청)
		* 자판기 커피 보유 총 개수에서 줄임
* 돈을 불충분하게 넣은 경우(200원, 2개 요청)
	* 사용자가 입력한 전체가 거스름돈이 됨

💆 1.알고리즘 전 기존의 coffee.py

coffee = 10  # 자판기의 커피 개수
total_money = 5000
print('커피가', coffee, '잔 남았습니다.')
print('커피 한 잔의 가격은 300원입니다.')
while True:
    if not coffee:  # 커피가 없으면
        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
        break
    if total_money <= 0:
        print("잔돈이 없습니다. 다음에 이용해주세요.")
        break
    cups = int(input('커피 몇 잔 드릴까요?: '))
    if cups > coffee:
        print('커피가', coffee, '잔 남았습니다. 개수를 다시 지정해주세요.')
        continue
    money = int(input("돈을 넣어 주세요: "))
    if 300 < money < 300 * cups:
        print(cups, '잔 구매할 경우', -(money - 300 * cups), '원이 부족합니다.')
        print("그래서 %d잔 드리겠습니다." % (money // 300))
        print('거스름돈은', -(money - 300 * cups), '원입니다.')
        coffee -= (money // 300)
        print("남은 커피의 양은 %d개 입니다." % coffee)
        print("남은 돈은 %d 입니다." % total_money)
        continue
    if money <= total_money:
        if money >= 300:
            print("커피를 %d잔 줍니다." % cups)
            coffee -= cups
            if money - 300 * cups != 0:
                print('거스름돈은', money - 300 * cups, '원입니다.')
                total_money -= money - 300 * cups
        elif money < 300:
            print(cups, '잔 구매할 경우', -(money - 300 * cups), '원이 부족합니다.')
            print("다시 거스름돈 %d 원을 반환해드리겠습니다. " % money)
        print("남은 커피의 양은 %d개 입니다." % coffee)
        print("남은 돈은 %d 입니다." % total_money)
    else:
        print("거스름 돈이 부족하여 판매할 수 없습니다.")

🤼‍ 2.알고리즘으로 적용시킨 coffee.py

import sys

class CoffeeMachine:
    total_amount = 10  # 자판기가 가지고 있는 총 커피 개수
    total_amount_price = 5000  # 자판기가 가지고 있는 총 금액
    coffee_price = 300  # 커피 한개의 가격(EX: 300원)
    put_price = 0  # 원하는 커피 개수
    req_coffee_nums = 0  # 주문한 커피 개수
    remaining_price = 0  # 돌려줄 금액(거스름 돈)

    def request(self):
        # * 사용자로 부터 돈과 원하는 커피 개수를 입력 받는 동작
        self.req_coffee_nums = cups = int(input('커피 몇 잔 드릴까요?: '))
        self.put_price = int(input("돈을 넣어 주세요: "))

    def check_amount(self):
        # * 현재 자판기에 남은 돈과 남아 있는 커피 개수 점검
        if self.total_amount <= 0:
            return False
        elif self.total_amount_price <= 0:
            return False
        else:
            return True

    def check_amount_print(self, num, remain):
        if self.total_amount <= 0:
            print('[ FAIL ] 커피 자판기에 커피 개수가 부족하거나 또는 보유 금액이 부족합니다.')
            sys.exit(2)
        elif self.total_amount_price <= 0:
            print("잔돈이 없습니다. 다음에 이용해주세요")
            sys.exit(2)
        else:
            print('[ OK ] 커피 %d 개를 드립니다.' % num)
            print('[ OK ] 거스름돈 %d 만큼 드립니다.' % remain)

    def info(self):
        # * 자판기에 남은 돈과 남아 있는 커피 개수 출력
        print("+--------------------------------------------")
        print("| 총 금액:", self.total_amount_price)
        print("| 총 개수:", self.total_amount)
        print("| 커피 가격:", self.coffee_price)
        print("+--------------------------------------------")

    def get(self):
        # * 커피를 뽑는 동작
        # * 1) 돈을 반정도 넣은 경우(EX: 500원, 2개 요청)
        # * 2) 돈을 충분히 넣은 경우(EX: 700원, 2개 요청)
        # * 3) 돈을 불충분하게 넣은 경우(200원, 2개 요청)
        price = self.req_coffee_nums * self.coffee_price  # 변수 만들기
        short_price = -(self.put_price - self.coffee_price * self.req_coffee_nums)  # 변수 만들기

        # * 1) 돈을 반정도 넣은 경우(EX: 500원, 2개 요청)
        if self.coffee_price < self.put_price < self.req_coffee_nums * self.coffee_price:
            print(self.req_coffee_nums, '잔 구매할 경우', short_price, '원이 부족합니다.')
            print("그래서 %d잔 드리겠습니다." % (self.put_price // self.coffee_price))
            print('거스름돈은 ', short_price, '원입니다.')
            self.total_amount -= (self.put_price // self.coffee_price)
            print("남은 커피의 양은 %d개 입니다." % self.total_amount)
            print("남은 돈은 %d 입니다. " % self.total_amount_price)
            return True

        # * 2) 돈을 충분히 넣은 경우(EX: 700원, 2개 요청)
        if self.put_price <= self.total_amount_price:
            if self.put_price >= self.coffee_price:
                print("커피를 %d잔 줍니다." % self.req_coffee_nums)
                self.total_amount -= self.req_coffee_nums
                if self.put_price - self.coffee_price * self.req_coffee_nums != 0:
                    print('거스름돈은 ', self.put_price - self.coffee_price * self.req_coffee_nums, '원입니다.')
                    self.total_amount_price -= self.put_price - self.coffee_price * self.req_coffee_nums

        # * 3) 돈을 불충분하게 넣은 경우(200원, 2개 요청)
        elif self.put_price < self.coffee_price:
            print(self.req_coffee_nums, '잔 구매할 경우', short_price, '원이 부족합니다.')
            print("다시 거스름돈 %d 원을 반환해드리겠습니다. " % self.put_price)
            print("남은 커피의 양은 %d개 입니다." % self.total_amount)
            print("남은 돈은 %d 입니다. " % self.total_amount_price)
        else:
            print("거스름 돈이 부족하여 판매할 수 없습니다.")


def main():
    c = CoffeeMachine()
    while True:
        # 1) 입력(커피 개수, 돈 입력)
        c.info()
        c.request()
        # 2) 커피 자판기가 계산
        if c.check_amount():
            c.get()
        else:
            print('[ FAIL ] 커피 자판기에 커피 개수가 부족하거나 또는 보유 금액이 부족합니다.')
            sys.exit(1)
        # 3) 출력(커피 개수, 거스름돈)
        c.info()
        input('Press any key ....')

if __name__ == '__main__':
    main()

🌐 3. TEST

  • 거스름돈과 커피의 개수가 올바르게 주는 것을 확인
  • 돈을 불충분하게 넣은 경우확인
  • 돈을 거스름돈보다 많이 넣은 경우 판매불가 확인
  • 커피의 개수가 없을 때 판매중지 확인
profile
더욱 더 발전된 엔지니어가 되기 위한 개인 공부 블로그(DevOps/Cloud)

0개의 댓글