Hi, There!
안녕하세요, 바오밥입니다.
목차
- 문제
- 풀이
문제
문제 내용
미용실과 레스토랑이 예약을 받는 기준은 다음과 같습니다.
미용실
- 인원수가 1명인 경우에만 예약받습니다.
- 다른 손님과 예약 시간이 겹칠 수 없습니다.
레스토랑
- 인원수가 2명 이상 8명 이하인 경우에만 예약받습니다.
- 최대 두 팀까지 예약 시간이 겹칠 수 있습니다.
두 가게에서 예약을 받은 횟수를 계산하기 위해 다음과 같이 Customer, Shop, HairShop, Restaurant 클래스를 작성했습니다.
Customer:
- Customer : 고객을 나타내는 클래스입니다.
- id : 고객 식별 번호를 나타냅니다.
- time : 고객이 신청한 예약 시간을 나타냅니다.
- num_of_people : 예약 인원 수를 나타냅니다.
Shop :
- Shop : 가게를 나타내는 클래스입니다.
- reserve_list : 가게에 예약한 고객 리스트입니다.
- reserve : 고객을 매개변수로 받아, 예약 고객 리스트에 추가 후 true를 return합니다.
HairShop :
- HairShop : 미용실을 나타내는 클래스이며, Shop을 상속합니다.
- reserve : 고객을 매개변수로 받아, 미용실의 예약 기준에 맞는지 검사 합니다. 예약을 받았다면 예약 고객 리스트에 추가 후 true를 return하고, 그렇지 않으면 false를 return 합니다.
Restaurant :
- Restaurant는 레스토랑을 나타내는 클래스이며, Shop을 상속합니다.
- reserve : 고객을 매개변수로 받아, 레스토랑의 예약 기준에 맞는지 검사 합니다. 예약을 받았다면 예약 고객 리스트에 추가 후 true를 return하고, 그렇지 않으면 false를 return 합니다.
예약을 원하는 고객 정보가 담긴 리스트 customers와 shops가 매개변수로 주어질 때, 두 가게에서 예약받은 횟수를 return 하도록 solution 함수를 작성하려고 합니다.
위 클래스 구조를 참고하여 주어진 코드의 빈칸을 적절히 채워 전체 코드를 완성해주세요.
매개변수 설명
예약을 원하는 고객 정보가 담긴 리스트 customers와 shops가 solution 함수의 매개변수로 주어집니다.
- customers의 길이와 shops의 길이는 항상 같습니다.
- customers의 각 원소에는 고객 정보가 [고객 ID, 예약 시간, 예약 인원수] 순으로 들어있습니다.
- 고객 ID는 1 이상 10,000 이하인 자연수입니다.
- 예약 시간은 0 이상 23 이하인 정수입니다.
- 예약 인원수는 1 이상 10 이하인 자연수입니다.
- 고객 ID는 중복해서 주어지지 않습니다.
- customers에는 고객이 예약을 신청한 순서대로 들어있습니다.
- shops는 각 고객이 예약할 가게를 나타내며, "hairshop" 또는 "restaurant" 로만 구성되어 있습니다.
- i 번째 고객이 예약할 가게는 shops[i] 입니다.
- 예약을 신청한 고객의 수는 1 이상 10 이하입니다.
return 값 설명
두 가게에서 예약받은 횟수를 return 해주세요.
예시
예시 설명
고객별 예약 정보는 다음과 같습니다.
- 첫 번째 고객은 미용실에서 예약받습니다.
- 두 번째 고객은 레스토랑에서 예약받습니다.
- 세 번째 고객은 미용실에서 예약받습니다.
- 네 번째 고객은 예약받지 않습니다. 2시에 미용실을 먼저 예약한 손님이 있기 때문입니다.
- 다섯 번째 고객은 예약받지 않습니다. 레스토랑에 한 번에 예약 가능한 인원수는 2명 이상 8명 이하입니다.
풀이
풀이 코드 및 해설
class Customer:
def __init__(self, id, time, num_of_people):
self.id = id
self.time = time
self.num_of_people = num_of_people
class Shop:
def __init__(self):
self.reserve_list = []
def reserve(self, customer):
self.reserve_list.append(customer)
return True
class HairShop(Shop): # Shop 클래스를 상속 받아 구현
def __init__(self):
super().__init__()
def reserve(self, customer): # 예약 메서드
if customer.num_of_people != 1: # 예약은 1명인 경우에만 가능
return False
for r in self.reserve_list: # 예약 리스트 순회
if r.time == customer.time: # 이미 예약된 리스트와 예약 시간이 안 겹치는 경우에만 가능
return False
self.reserve_list.append(customer) # 위 두 조건을 만족한 경우 예약 리스트에 추가
return True
class Restaurant(Shop): # Shop 클래스를 상속 받아 구현
def __init__(self):
super().__init__()
def reserve(self, customer):
if (2 <= customer.num_of_people <= 8) != True: # 예약은 2명이상 8명이하인 경우만 가능
return False
count = 0
for r in self.reserve_list: # 예약 리스트 순회
if r.time == customer.time: # 이미 예약된 리스트와 예약 시간이 1팀이하로 겹칠때만 가능
count += 1
if count >= 2:
return False
self.reserve_list.append(customer) # 위 두 조건을 만족한 경우 예약 리스트에 추가
return True
def solution(customers, shops):
hairshop = HairShop()
restaurant = Restaurant()
count = 0
for customer, shop in zip(customers, shops):
if shop == "hairshop":
if hairshop.reserve(Customer(customer[0], customer[1], customer[2])):
count += 1
elif shop == "restaurant":
if restaurant.reserve(Customer(customer[0], customer[1], customer[2])):
count += 1
return count
'Certificate > Cert - Cos Pro 1급' 카테고리의 다른 글
[Cos Pro 1급] 기출문제 4회차, 문자열 압축 (0) | 2021.07.16 |
---|---|
[Cos Pro 1급] 기출문제 4회차, 사전에서 단어찾기 (0) | 2021.07.16 |
[Cos Pro 1급] 기출문제 3회차, 팝업 스토어를 열 최적의 날짜 (0) | 2021.07.15 |
[Cos Pro 1급] 기출문제 3회차, 선풍기를 몇대 사야 하나요 (0) | 2021.07.15 |
[Cos Pro 1급] 기출문제 3회차, 카프리카 수 (0) | 2021.07.15 |