저번 주차에 배운 내용들
저번주차에는 페어 프로그래밍을 통한 알고리즘 풀이를 하였다.
특별히 기억나는 알고리즘 문제 2개를 가져왓다.
알고리즘
바리스타가 커피를 만드는 알고리즘
class MenuItem:
def __init__(self, name, price, ingredients):
self.name = name
self.price = price
self.ingredients = ingredients
def __str__(self):
return f"{self.name}: {self.price}원"
class Menu:
def __init__(self):
self.items = {}
def add_item(self, item_name, item):
"""메뉴에 메뉴 아이템 객체 추가"""
self.items[item_name] = item
def show_menu(self):
"""메뉴에 저장된 모든 아이템을 출력"""
for key in self.items:
print(self.items[key])
def get_items(self):
"""메뉴에 저장된 모든 아이템을 딕셔너리 형태로 리턴"""
return self.items
def get_item(self, item_name):
"""{item_name}의 value, 메뉴 아이템 객체를 리턴"""
return self.items[item_name]
class InventoryItem:
def __init__(self, name, quantity):
self.name = name
self.quantity = quantity
def __str__(self):
return f"{self.name}: {self.quantity}"
def add_quantity(self, quantity):
"""아이템의 수량 증가"""
self.quantity += quantity
def remove_quantity(self, quantity):
"""아이템의 수량 감소. 결과가 0개 미만일 경우 에러"""
if self.quantity - quantity < 0:
raise ValueError(f"{self.name}이 충분하지 않습니다. [{self.quantity}]")
self.quantity -= quantity
class Inventory:
def __init__(self):
self.items = {}
def add_item(self, item_name, item):
"""인벤토리에 인벤토리 아이템 객체 추가"""
self.items[item_name] = item
def get_items(self):
"""인벤토리에 저장된 모든 아이템을 딕셔너리 형태로 리턴"""
return self.items
def get_item(self, item_name):
"""{item_name}의 value, 인벤토리 아이템 객체를 리턴"""
return self.items[item_name]
def add_item_quantity(self, item_name, quantity):
"""인벤토리에 {item_name}를 key로 등록된 인벤토리 아이템 객체의 수량 증가"""
self.items[item_name].add_quantity(quantity)
def remove_item_quantity(self, item_name, quantity):
"""인벤토리에 {item_name}를 key로 등록된 인벤토리 아이템 객체의 수량 감소"""
self.items[item_name].remove_quantity(quantity)
class Person:
def __init__(self, name, inventory):
self.name = name
self.inventory = inventory
def action(self, param):
pass
def info(self):
"""Person 객체의 이름, 인벤토리 정보를 출력"""
print(f"이름 : {self.name}")
print("소지품")
items = self.inventory.get_items()
for key in items:
print(items[key])
class Customer(Person):
def __init__(self, name, inventory):
super().__init__(name, inventory)
self.order = None
# 주문
def action(self, order_item):
if self.inventory.get_item("money").quantity > order_item.price:
self.order = order_item
else:
NameError
class Barista(Person):
def __init__(self, name, inventory):
super().__init__(name, inventory)
# 커피 제조
def action(self, customer):
customer.order
for ingred in customer.order.ingredients:
self.inventory.remove_item_quantity(ingred, customer.order.ingredients[ingred])
customer.inventory.get_item('money').remove_quantity(customer.order.price)
self.inventory.add_item_quantity('money', customer.order.price)
"""
Q. Person 클래스에게 상속받은 action 메소드를 오버라이딩하여 바리스타가 커피를 제조하는 메소드를 만들어봅시다.
요구사항.
1. action 메소드의 인자로는 주문하는 고객 객체를 받습니다.
2. 고객의 주문을 만들기 위해 필요한 제료를 바리스타의 인벤토리에서 빼줍니다.(재료가 충분하지 않다면 InventoryItem 객체에서 에러가 발생합니다)
3. 제조가 완료 되었다면 고객 인벤토리에서 돈을 빼주고 바리스타 인벤토리에 돈을 더해줍니다.
"""
def get_income(self):
"""Barista 객체가 보유한 money를 리턴"""
return self.inventory.get_item("money")
# 카페 메뉴 생성
menu = Menu()
menu.add_item("americano", MenuItem("Americano", 3000, {"bean": 2, "water": 2}))
menu.add_item("latte", MenuItem("Latte", 3000, {"bean": 2, "milk": 2}))
print("--메뉴 정보--")
menu.show_menu()
# 고객 생성
customer_inventory = Inventory()
customer_inventory.add_item("money", InventoryItem("Money", 10000))
customer = Customer("철수", customer_inventory)
print("--고객 정보--")
customer.info()
# 바리스타 생성
barista_inventory = Inventory()
barista_inventory.add_item("water", InventoryItem("Water", 20))
barista_inventory.add_item("bean", InventoryItem("Bean", 20))
barista_inventory.add_item("milk", InventoryItem("Milk", 10))
barista_inventory.add_item("money", InventoryItem("Money", 0))
barista = Barista("민수", barista_inventory)
print("--바리스타 정보--")
barista.info()
# 주문
customer.action(menu.get_item("americano"))
# 커피 제조
barista.action(customer)
# 정보 확인
print("--고객 정보--")
customer.info()
print("--바리스타 정보--")
barista.info()
print("")
print(f"바리스타 수입 : {barista.get_income()}")
OX 퀴즈
#덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열
# quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를
# 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.
# 연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
# 1 ≤ quiz의 길이 ≤ 10
# X, Y, Z는 각각 0부터 9까지 숫자로 이루어진 정수를 의미하며, 각 숫자의 맨 앞에 마이너스 기호가 하나 있을 수 있고 이는 음수를 의미합니다.
# X, Y, Z는 0을 제외하고는 0으로 시작하지 않습니다.
# -10,000 ≤ X, Y ≤ 10,000
# -20,000 ≤ Z ≤ 20,000
# [연산자]는 + 와 - 중 하나입니다.
# 함수에 들어가는 수식이 문자열이니까 변경해 줘야함
# 연산하고 맞을때와 틀릴때 구분하기
#
input1 = ["3 - 4 = -3", "5 + 6 = 11"]
input2 = ["19 - 6 = 13", "5 + 66 = 71", "5 - 15 = 63", "3 - 1 = 2"]
def solution(quiz):
list1 = []
answer = []
for i in quiz:
list1 = i.split(' ')
print(list1)
if list1[1] == '+':
if int(list1[0]) + int(list1[2]) == int(list1[-1]):
answer.append("O")
elif not int(list1[0]) + int(list1[2]) == int(list1[-1]):
answer.append("X")
elif list1[1] == '-':
if int(list1[0]) - int(list1[2]) == int(list1[-1]):
answer.append("O")
elif not int(list1[0]) - int(list1[2]) == int(list1[-1]):
answer.append("X")
return answer
print(solution(input1))
print(solution(input2))
숫자 2개를 받아서 o 와 x를 판별하는 알고리즘