본문 바로가기
프로그램

[파이썬] 문제 : 커피 판매 키오스크

by 오디세이99 2023. 5. 21.
728x90
반응형

import unicodedata

menu={'라떼':1000, '민트초콜렛':1500, '딸기스무디':5000, '아이스티':3000, '아메리카노':2000}
str_max = max(list(map(len, menu.keys())))


def fmt(string, width, align='<', fill=' '):    # 한글 넓이를 맞추기 위한 함수
    count = (width - sum(1 + (unicodedata.east_asian_width(c) in "WF") for c in string))
    return {
        '>': lambda s: fill * count + s, # lambda 매개변수 : 표현식
        '<': lambda s: s + fill * count,
        '^': lambda s: fill * (count / 2)
                       + s
                       + fill * (count / 2 + count % 2)
    }[align](string)

def show_menu():                    # 메뉴 출력. 메뉴를 보여주기 위함
    print('+'*30)
    for i, key in enumerate(sorted(list(menu.keys()))):
        print("[{:>}] {} : {:>}".format(fmt(str(i+1),2), fmt(key,10), fmt(str(menu[key]),5)))
    print('+'*30)

def show_order(order_dic):          # 주문 받은 내용 출력
    sum_money =  0
    print('-'*30)
    for i,key in enumerate(sorted(list(order_dic.keys()))):
        print("[{:>}] {} : {:>}".format(fmt(str(i+1),2), fmt(key, 10), fmt(str(order_dic[key]),5)))
        sum_money += menu[key] * order_dic[key]
    print('주문금액 :{:,}'.format(sum_money))
    print('-'*30)
    return sum_money
        
def show_order_report(order_dic, order_money, money, changes):  # 주문 받은 내용 및 입력금액, 잔액 등 출력
    print('='*30)
    for i, key in enumerate(sorted(list(order_dic.keys()))):
        print("[{:>} {} : {:>}".format(fmt(str(i+1),2), fmt(key, 10), fmt(str(order_dic[key]),5)))
    print('-'*30)
    print(f"총 커피값 : {order_money:,}, 입력금액 : {money:,}, 잔액:{changes:,}")
    print('='*30)
        
while True:                           # 1번 while. 주문 받기 무한 반복.
    show_menu()                        # 메뉴 보여주기 함수
    order = {}                         # 주문 받는 딕셔너리 변수. 빈 딕셔너리로 선언
    while True:                       # 2번 while. 한번 주문 받을때 여러 커피 주문 받기 위한 반복
        choice = input('커피: ')       # 커피면 입력 받기
        if choice.upper() == '':      # 아무겂도 입력하지 않으면 입력 종료
            break
        num = int(input('잔수: '))     # 커피수 입력 받음
        
        if choice in order.keys():    # 주문 받은 커피명이 기존 입력 받은 커피명에 있다면
            order[choice] += num      # 기존 커피잔 수에 더함
        else:                         # 기존 주문에 없다면 신규 커피
            order[choice] = num        # 주문 딕셔너리에 추가
    
    if choice.upper() == 'E' or choice == 'ㅂ':   # 주문의 커피명이 E or ㅂ 이면 키오스크 종료
        break
    
    if len(order.keys()) == 0:          # 주문 받은게 없이 취소했다면 처음 whle로 돌아감
        continue
    
    order_money = show_order(order)     # 주문 받은 내용 출력
    money = 0
    while money < order_money:          # 3번  while. 입력 받은 커피값이 주문값보다 작으면 반복
        money = input('커피값 입력(Q:주문취소): ')
        if money.upper() == 'Q':        # 커피값 입력시 주문취소하면 커피값 입력 반복문 종료
            break
        money = int(money)               # 입력 받은 커피값이 주문값보다 크면 정수로 변환
    
    if money != 'Q':                     # 커피값 입력에서 취소한 것이 아니면 
        changes = money - order_money     # 잔돈 계산
        show_order_report(order, order_money,  money, changes)   # 커피종류, 커피값, 입력금액, 잔액 출력
    
    order_end = input('다시 주문 받기(E:키오스크 종료): ')       # 키오스크 종료 여부
    if order_end.upper() == 'E':
        break

728x90
반응형

댓글