파이썬으로 자판기 코딩을 하는데 문제가 생겼습니다. TypeError: '<' not supported between instances of 'tuple' and 'int'

조회수 6165회
def show_menu():
    print()
    print("[자판기 판매 메뉴]")
    for i in range(0, len(drink_menu)):
        if i%10==0:
            print()
        print("|",i+1,".",drink_menu[i],":",drink_price[i],"|",end=" ")


def buy(num):
    if money < drink_price[num]:
        print("잔액이 부족합니다. 잔액 : %d" % money)
        return money
    else:
        print(drink_menu[num], " 구입완료")
        balance = money - drink_price[num]
        left_drink[num] = left_drink[num]-1
        print("잔액 : ", balance)
        return balance,left_drink

def drink(num):
    if left_drink[num]<1:
        print("음료가 모두 소진되었습니다.")
    else:
        pass




if __name__ == '__main__':

    drink_menu = ("생수","생수","생수","레몬워터","레몬워터","옥수수 수염차","옥수수 수염차", "우엉차","트레비","트레비",
                  "밀키스","펩시","핫식스","사이다","코코리치(망고)","코코리치(망고)","Lipton","트로피카나 스파클링(청사과)",
                  "트로피카나 스파클링(청사과)","트로피카나 스파클링(포도)", "가나초콜릿음료","가나초콜릿음료","레쓰비","레쓰비",
                  "칸타타","레쓰비 카페타임","게토레이","게토레이","코코팜","잔치집 식혜")
    drink_price = (600,600,600,1500,1500,1300,1300,1300,1000,1000,800,800,1000,1000,1000,1000,1000,1000,1000,1000,600,600,600,600,1000,1000,800,800,800,800)
    left_drink = [1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]


    money = 0
    money = int(input("돈을 투입하세요 : "))

    while True:
        show_menu()
        sel = int(input("\n메뉴 번호를 선택하세요 (종료 : 0) : "))
        if sel == 0:
            break;
        elif (sel >= 1 and sel <= len(drink_menu)):
            money = buy(sel - 1)
        else:
            print("잘못된 메뉴 번호입니다")

    print("자판기 종료, 잔액 %d 반환" % money)

    change_money_1000 = money // 1000
    change_money_500 = (money - (change_money_1000 * 1000)) // 500
    change_money_100 = (money - (change_money_1000 * 1000) - (change_money_500 * 500)) // 100
    print("1000원 짜리:", change_money_1000, "개", "500원짜리:", change_money_500, "개", "100원짜리:", change_money_100, "개")

음료를 구입할 때 left_drink의 해당 음료의 갯수를 하나 씩 줄이고 싶은데 실행을 하면

Traceback (most recent call last):
  File "C:/Users/JES/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 49, in <module>
    money = buy(sel - 1)
  File "C:/Users/JES/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 11, in buy
    if money < drink_price[num]:
TypeError: '<' not supported between instances of 'tuple' and 'int'

두가지 오류가 발생합니다 튜플로 하건 리스트로 하건 오류가 발생하는데 어떻게 해결하면 좋을까요?

1 답변

  • 이건 사실 간단한 문제입니다. 차근차근 어디서 문제가 생긴건지 말씀드리겠습니다.

    먼저 에러 내용을 보시면 아래와 같습니다.

    if money < drink_price[num]:<br>
    TypeError: unorderable types: tuple() < int()
    

    이는 말하자면 money가 tuple이며 drink_price[num]은 int형인데 비교연산자로 비교하기 때문에 생기는 에러라고 에러내용에 쓰여져 있습니다.

    자 그렇다면 어느 부분에서 money가 tuple로 변경이 되었을지 확인을 해보면 while문 내부의

    money = buy(sel - 1)
    

    이 부분에서 money의 값의 변경이 이루어집니다.

    자 그렇다면 이번에는 buy 함수의 리턴 결과에 대해서 보자면 잔액이 부족한 경우는 buy 함수는 정상적으로

    return money
    

    요 부분으로 인해 money 값만을 반환합니다.

    하지만 잔액이 부족하지 않은 정상처리된 결과 부분을 보면

    return balance, left_drink
    

    이 부분으로 인하여 money는 balance, left_drink 라는 값을 한번에 tuple로서 받게 되는 것입니다.

    그렇다면 해결 방안은 무엇일까요?

    두가지 방안이 있습니다.

    1. 값을 하나만 반환한다.
      • return balance, left_drink 이 부분을 return balance로 변경합니다.
    2. 잔액이 그대로인 경우 리턴값과 리턴 결과를 받는 부분을 수정한다.
      • 잔액이 모자란경우 left_drink를 추가해서 반환한다. return money, left_drink로 수정한다. 그리고 money = buy(sel - 1)money, _ = buy(sel - 1)로 수정할 수 있습니다.

    아래는 수정된 코드입니다.

    def show_menu():
        print()
        print("[자판기 판매 메뉴]")
        for i in range(0, len(drink_menu)):
            if i%10==0:
                print()
            print("|",i+1,".",drink_menu[i],":",drink_price[i],"|",end=" ")
    
    
    def buy(num):
        if money < drink_price[num]:
            print("잔액이 부족합니다. 잔액 : %d" % money)
            return money
        else:
            print(drink_menu[num], " 구입완료")
            balance = money - drink_price[num]
            left_drink[num] = left_drink[num]-1
            print("잔액 : ", balance)
            return balance
    
    def drink(num):
        if left_drink[num]<1:
            print("음료가 모두 소진되었습니다.")
        else:
            pass
    
    
    if __name__ == '__main__':
    
        drink_menu = ("생수","생수","생수","레몬워터","레몬워터","옥수수 수염차","옥수수 수염차", "우엉차","트레비","트레비",
                      "밀키스","펩시","핫식스","사이다","코코리치(망고)","코코리치(망고)","Lipton","트로피카나 스파클링(청사과)",
                      "트로피카나 스파클링(청사과)","트로피카나 스파클링(포도)", "가나초콜릿음료","가나초콜릿음료","레쓰비","레쓰비",
                      "칸타타","레쓰비 카페타임","게토레이","게토레이","코코팜","잔치집 식혜")
        drink_price = (600,600,600,1500,1500,1300,1300,1300,1000,1000,800,800,1000,1000,1000,1000,1000,1000,1000,1000,600,600,600,600,1000,1000,800,800,800,800)
        left_drink = [1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
    
    
        money = 0
        money = int(input("돈을 투입하세요 : "))
    
        while True:
            show_menu()
            sel = int(input("\n메뉴 번호를 선택하세요 (종료 : 0) : "))
            if sel == 0:
                break
            elif (sel >= 1 and sel <= len(drink_menu)):
                money = buy(sel - 1)
            else:
                print("잘못된 메뉴 번호입니다")
    
        print("자판기 종료, 잔액 %d 반환" % money)
    
        change_money_1000 = money // 1000
        change_money_500 = (money - (change_money_1000 * 1000)) // 500
        change_money_100 = (money - (change_money_1000 * 1000) - (change_money_500 * 500)) // 100
        print("1000원 짜리:", change_money_1000, "개", "500원짜리:", change_money_500, "개", "100원짜리:", change_money_100, "개")
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)