얼렁뚱땅

[Cos Pro 1급][Python][기출문제] 1차 문제1 본문

Python Study/Cos Pro 1급 기출문제

[Cos Pro 1급][Python][기출문제] 1차 문제1

당당익명 2024. 2. 1. 22:34
문제 유형 : 빈칸 채우기, 클래스 문제

 

💠문제설명

배달음식 전문점 운영을 위해 다음과 같이 DeliveryStore 인터페이스와  PizzaStore, Food 클래스를 작성했습니다.



* DeliveryStore :
  * DeliveryStore는 배달 음식점의 인터페이스입니다.
  * 배달 음식점은 set_order_list와 get_total_price 함수를 구현해야 합니다.
  * set_order_list 함수는 주문 메뉴의 리스트를 매개변수로 받아 저장합니다.
  * get_total_price 함수는 주문받은 음식 가격의 총합을 return 합니다.

* Food : 
  * Food는 음식을 나타내는 클래스입니다.
  * 음식은 이름(name)과 가격(price)으로 구성되어있습니다.

* PizzaStore
  * PizzaStore는 피자 배달 전문점을 나타내는 클래스이며 DeliveryStore 인터페이스를 구현합니다.
  * menu_list는 피자 배달 전문점에서 주문 할 수 있는 음식의 리스트를 저장합니다.
  * order_list는 주문 받은 음식들의 이름을 저장합니다.
  * set_order_list 함수는 주문 메뉴를 받아 order_list에 저장합니다.
  * get_total_price 함수는 order_list에 들어있는 음식 가격의 총합을 return 합니다.

주문 메뉴가 들어있는 리스트 order_list가 매개변수로 주어질 때, 주문한 메뉴의 전체 가격을 return 하도록 solution 함수를 작성하려고 합니다. 위의 클래스 구조를 참고하여 주어진 코드의 빈칸을 적절히 채워 전체 코드를 완성해주세요.

 

💠매개변수 설명

더보기

주문 메뉴가 들어있는 리스트 order_list가 solution 함수의 매개변수로 주어집니다.

* order_list의 길이는 1 이상 5이하입니댜.
* order_list에는 주문하려는 메뉴의 이름들이 문자열 형태로 들어있습니다.
  * order_list에는 같은 메뉴의 이름이 중복해서 들어있지 않습니다.
* 메뉴의 이름과 가격은 PizzaStore의 생성자에서 초기화해줍니다.

💠Return 설명

더보기

주문한 메뉴의 전체 가격을 return 해주세요.

💠예시

더보기

| order_list                           | return |
|-------------------------------------|--------|
| ["Cheese", "Pineapple", "Meatball"] | 51600  |

💠코드

from abc import *
 
class DeliveryStore(metaclass=ABCMeta):
    @abstractmethod
    def set_order_list(self, order_list):
        pass
    
    @abstractmethod
    def get_total_price(self):
        pass
    
class Food:
    def __init__(self, name, price):
        self.name = name
        self.price = price
        
class PizzaStore(DeliveryStore):
    def __init__(self):
        menu_names = ["Cheese", "Potato", "Shrimp", "Pineapple", "Meatball"]
        menu_prices = [11100, 12600, 13300, 21000, 19500];
        self.menu_list = []
        for i in range(5):
            self.menu_list.append(Food(menu_names[i], menu_prices[i]))
        
        self.order_list = []
    
    def set_order_list(self, order_list):
        for order in order_list:
            self.order_list.append(order)

    def get_total_price(self):
        total_price = 0
        for order in self.order_list:
            for menu in self.menu_list:
                if order == menu.name:
                    total_price += menu.price
        return total_price 
            
def solution(order_list):
    delivery_store = PizzaStore()
    
    delivery_store.set_order_list(order_list)
    total_price = delivery_store.get_total_price()
    return total_price

#The following is code to output testcase.
order_list = ["Cheese", "Pineapple", "Meatball"]
ret = solution(order_list)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret, ".")

 

💠개인정리

Interface

인터페이스는 실제로 인스턴스를 만드는 용도가 아니라, 이것을 상속 받는 클래스를 생성할 때 사용된다.

즉, 인터페이스로 -> 클래스 생성, 클래스로 -> 인스턴스 생성 이라고 보면 된다.

클래스는 인터페이스 안에 있는 함수를 상속 받아서 구현해야 한다. 

 

abc 내부의 ABCMeta라는 것을 metaclass로 지정하면(=), 인터페이스 역할을 하는 클래스가 된다.

인터페이스는 추상 메서드(@abstractmethod)를 가질 수 있다. 즉, pass 구문을 통해 메서드 정의만 해두고 구현하지 않는다.

from abc import *
 
class DeliveryStore(metaclass=ABCMeta):
    @abstractmethod
    def set_order_list(self, order_list):
        pass
    
    @abstractmethod
    def get_total_price(self):
        pass

 

상속 받는 법

클래스 argument 괄호에 인터페이스 명만 넣어주면 된다.

class PizzaStore(DeliveryStore):

 

생성자

class Food:
    def __init__(self, name, price):
        self.name = name
        self.price = price

class PizzaStore(DeliveryStore):
    def __init__(self):
        menu_names = ["Cheese", "Potato", "Shrimp", "Pineapple", "Meatball"]
        menu_prices = [11100, 12600, 13300, 21000, 19500];
        self.menu_list = []

 

클래스 함수

인터페이스와 동일한 형태로 만들어야하기 때문에 argument까지 다 복사해서 붙여넣는다.