트랙
/
Julia
Julia
/
연습 문제
/
Cater Waiter
Cater Waiter

Cater Waiter

학습 연습 문제

소개

Set은 다음과 같은 특징을 가진 항목들의 모음이에요:

  • 순서가 없어요.
  • 항목은 서로 달라야 해요. 그래서 중복을 추가하려고 해도 아무런 알림 없이 무시돼요.
  • 수학의 집합에서 흔히 쓰는 연산을 많이 지원해요.

Set() 생성자로 만들 수 있어요. 매개변수로는 어떤 이터레이터든 넣을 수 있어요.

julia> s1 = Set(1:4)
Set([4, 2, 3, 1])

새 원소는 push!()로 추가하고(배열과 같아요), delete!()로 삭제해요.

julia> push!(s1, 5)
Set([5, 4, 2, 3, 1])

# Duplicates are ignored
julia> push!(s1, 3)
Set([5, 4, 2, 3, 1])

julia> delete!(s1, 5)
Set([4, 2, 3, 1])

julia> length(s1)  # length counts entries, despite the non-sequential type
4

Set 연산

다른 여러 컬렉션 타입과 마찬가지로, in 또는 ∈ 연산자로 항목이 들어 있는지 확인해요 (∈ 기호는 \in을 입력한 뒤 탭을 눌러요).

julia> 3 ∈ s1
true

Set 두 개에 대해 다음 연산을 지원해요 (괄호 안은 연산자 기호를 입력하는 단축키예요).

  • union(A, B) 또는 A ∪ B (\cup): A 또는 B, 또는 둘 다에 있는 모든 항목이에요.
  • intersect(A, B) 또는 A ∩ B (\cap): A와 B 모두에 공통으로 있는 모든 항목이에요.
  • setdiff(A, B) (기호 없음): A에는 있지만 B에는 없는 항목이에요.
  • symdiff(A, B) (기호 없음): A 또는 B 중 한쪽에만 있는 항목이에요.
  • issubset(A, B) 또는 A ⊆ B (\subseteq) 또는 B ⊇ A (\supseteq): A의 모든 항목이 B에도 있으면 true예요.
  • issetequal(A, B) (기호 없음): A와 B가 정확히 같은 항목을 담고 있으면 true예요.
  • isdisjoint(A, B) (기호 없음): A와 B에 공통인 항목이 하나도 없으면 true예요 (그래서 교집합이 비어 있어요).
julia> s1 = Set(1:4);
julia> s2 = Set(3:6);
julia> s1 ∪ s2  # union
Set([5, 4, 6, 2, 3, 1])

julia> s1 ∩ s2  # intersect
Set([4, 3])
  
julia> setdiff(s1, s2)
Set([2, 1])

julia> symdiff(s1, s2)
Set([5, 6, 2, 1])
  
julia> s1 ⊇ s2  # issubset
false

이 중 상당수는 함수 이름에 !를 붙인 변경 버전도 있어요. 전체 함수 목록은 매뉴얼에서 볼 수 있어요.

지침

여러분과 사업 파트너들은 작은 케이터링 회사를 운영해요. 방금 지역 요리 동호회의 행사를 맡기로 했는데, 이 행사에서는 "동호회 인기" 요리들을 선보일 예정이에요. 그 동호회는 큰 행사를 주최해 본 경험이 거의 없어서 준비, 장보기, 손질, 서빙까지 도움이 필요해요. 그래서 전체 준비 과정을 빠르게 진행하려고 작은 Julia 함수 몇 개를 작성하기로 했어요.

1. 요리 재료 중복 정리하기

이번 행사의 레시피들은 여러 출처에서 가져온 것이라 재료가 중복(또는 그 이상)으로 들어가 있는 것 같아요. 재료를 필요 이상으로 사게 되면 곤란하겠죠! 장보기와 요리를 시작하기 전에 각 요리의 재료 목록을 "정리"해야 해요.

clean_ingredients(dish_name, dish_ingredients) 함수는 요리 이름과 재료의 Vector를 인자로 받아요. 이 함수는 첫 번째 항목으로 요리 이름을, 그다음으로 중복을 제거한 재료의 Set을 담은 Tuple을 반환해야 해요.

julia> clean_ingredients("Punjabi-Style Chole", ["onions", "tomatoes", "ginger paste", "garlic paste", "ginger paste", "vegetable oil", "bay leaves", "cloves", "cardamom", "cilantro", "peppercorns", "cumin powder", "chickpeas", "coriander powder", "red chili powder", "ground turmeric", "garam masala", "chickpeas", "ginger", "cilantro"])
("Punjabi-Style Chole", Set(["garam masala", "bay leaves", "ground turmeric", "ginger", "garlic paste", "peppercorns", "ginger paste", "red chili powder", "cardamom", "chickpeas", "cumin powder", "vegetable oil", "tomatoes", "coriander powder", "onions", "cilantro", "cloves"]))

2. 칵테일과 "mocktail"

이번 행사에는 칵테일과 알코올이 들어가지 않은 혼합 음료인 "mocktail"이 모두 나가요. "mocktail" 음료에 정말 알코올이 들어 있지 않은지, 칵테일에는 정말 알코올이 들어 있는지 확인해야 해요.

check_drinks(drink_name, drink_ingredients) 함수는 음료 이름과 재료의 Vector를 인자로 받아요. 이 함수는 알코올 재료가 없으면 음료 이름 뒤에 "Mocktail"을, 알코올이 들어 있으면 음료 이름 뒤에 "Cocktail"을 붙여서 반환해야 해요. 이 연습 문제에서는 칵테일에 ALCOHOLS 상수에 있는 알코올만 들어간다고 가정해요.

julia> check_drinks("Honeydew Cucumber", ["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])
"Honeydew Cucumber Mocktail"

julia> check_drinks("Shirley Tonic", ["cinnamon stick", "scotch", "whole cloves", "ginger", "pomegranate juice", "sugar", "club soda"])
"Shirley Tonic Cocktail"

3. 요리 분류하기

손님 명단에는 식이 요구 사항이 각기 다른 분들이 있어서, 직원들이 요리를 VEGAN, VEGETARIAN, PALEO, KETO, OMNIVORE로 나눠야 해요.

categorize_dish(dish_name, dish_ingredients) 함수는 요리 이름과 그 요리의 재료 set을 인자로 받아요. 이 함수는 dish name: CATEGORY 형식의 String을 반환해야 해요. 괄호 안은 요리가 속한 식사 카테고리예요. 모든 요리는 VEGAN, VEGETARIAN, PALEO, KETO, OMNIVORE 중 하나에 "해당"해요.

julia> categorize_dish("Sticky Lemon Tofu", Set(["tofu", "soy sauce", "salt", "black pepper", "cornstarch", "vegetable oil", "garlic", "ginger", "water", "vegetable stock", "lemon juice", "lemon zest", "sugar"]))
"Sticky Lemon Tofu: VEGAN"

julia> categorize_dish("Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole", Set(["shrimp", "bacon", "avocado", "chickpeas", "fresh tortillas", "sea salt", "guajillo chile", "slivered almonds", "olive oil", "butter", "black pepper", "garlic", "onion"]))
"Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole: OMNIVORE"

4. 알레르기 유발 재료와 제한 식품 표시하기

일부 손님은 알레르기와 추가 식이 제한이 있어요. 문제가 생기지 않도록 이런 재료는 요리마다 표시하거나 주석을 달아 둬야 해요.

tag_special_ingredients(dish) 함수는 첫 번째 위치에 요리 이름이, 두 번째 위치에 그 요리의 재료 Vector 또는 Set이 들어 있는 Tuple을 인자로 받아요. 요리 설명에 특별한 주의가 필요한 재료의 Set을 요리 이름 뒤에 붙여서 반환해요. Vector 안의 요리 재료에는 중복이 있을 수도 있고 없을 수도 있어요. 이 연습 문제에서는 표시해야 하는 모든 알레르기 유발 재료나 특수 재료가 SPECIAL_INGREDIENTS 상수에 들어 있다고 가정해요.

julia> tag_special_ingredients(("Ginger Glazed Tofu Cutlets", ["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]))
("Ginger Glazed Tofu Cutlets", Set(["garlic","soy sauce","tofu"]))

julia> tag_special_ingredients(("Arugula and Roasted Pork Salad", ["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts", "balsamic vinegar", "onions", "black pepper"
]))
("Arugula and Roasted Pork Salad", Set(["pork tenderloin", "blue cheese", "pine nuts", "onions"]))

5. 재료 "마스터 목록" 만들기

주문과 장보기를 준비하려면 메뉴에 있는 모든 요리의 재료로 "마스터 목록"을 만들어야 해요. 수량은 나중에 채워 넣어요.

compile_ingredients(dishes) 함수는 요리들의 Vector를 인자로 받아 목록에 있는 모든 요리의 재료 전체를 담은 집합을 반환해요. 각각의 요리는 재료의 Set으로 표현돼요.

julia> dishes = [Set(["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]), Set(["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts","balsamic vinegar", "onions", "black pepper"]), Set(["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])];

julia> compile_ingredients(dishes)
Set(["arugula", "brown sugar", "honeydew", "coconut water", "english cucumber", "balsamic vinegar", "mint leaves", "pears", "pork tenderloin", "ginger", "blue cheese", "soy sauce", "sesame seeds", "black pepper", "garlic", "lime juice", "corn starch", "pine nuts", "lemon juice", "onions", "salt", "tofu"])

6. 쟁반에 낼 애피타이저 따로 빼기

주최자들이 쟁반에 내놓을 "한입 크기" 애피타이저로 준비해 달라고 부탁한 요리 목록을 줬어요. 이 요리들은 더 큰 접시로 준비하는 요리들의 주 목록에서 빼내야 해요.

separate_appetizers(dishes, appetizers) 함수는 요리 이름의 Vector와 애피타이저 이름의 Vector를 인자로 받아요. 이 함수는 애피타이저 이름을 뺀 요리 이름 목록의 Vector를 반환해야 해요. dishes나 appetizers Vector에는 중복이 있을 수 있어서 중복 제거가 필요할 수도 있어요.

julia> dishes = ["Avocado Deviled Eggs","Flank Steak with Chimichurri and Asparagus", "Kingfish Lettuce Cups", "Grilled Flank Steak with Caesar Salad","Vegetarian Khoresh Bademjan","Avocado Deviled Eggs", "Barley Risotto","Kingfish Lettuce Cups"];
          
julia> appetizers = ["Kingfish Lettuce Cups","Avocado Deviled Eggs","Satay Steak Skewers", "Dahi Puri with Black Chickpeas","Avocado Deviled Eggs","Asparagus Puffs", "Asparagus Puffs"];
              
julia> separate_appetizers(dishes, appetizers)
["Vegetarian Khoresh Bademjan", "Barley Risotto", "Flank Steak with Chimichurri and Asparagus", "Grilled Flank Steak with Caesar Salad"]

7. 한 가지 요리에만 쓰인 재료 찾기

각 카테고리(VEGAN, VEGETARIAN, PALEO, KETO, OMNIVORE)에서 한 가지 요리에만 들어가는 재료를 골라낼 거예요. 이런 "singleton" 재료는 다른 일을 처리하느라 잊히지 않도록 전담 장보기 담당자를 배정해요.

singleton_ingredients(dishes, intersection) 함수는 요리들의 Vector와 같은 카테고리의 CATEGORY_INTERSECTION 상수를 인자로 받아요. 각 요리는 재료의 Set으로 표현돼요. 각 CATEGORY_INTERSECTION은 그 카테고리에서 두 개 이상의 요리에 들어가는 재료의 Set이에요. 집합 연산을 사용해 "singleton" 재료(카테고리에서 한 가지 요리에만 들어가는 재료)의 Set을 반환해야 해요.

julia> singleton_ingredients(example_dishes, EXAMPLE_INTERSECTION)
Set(["garlic powder", "sunflower oil", "mixed herbs", "cornstarch", "celeriac", "honey", "mushrooms", "bell pepper", "rosemary", "parsley", "lemon", "yeast", "vegetable oil", "vegetable stock", "silken tofu", "tofu", "cashews", "lemon zest", "smoked tofu", "spaghetti", "ginger", "breadcrumbs", "tomatoes", "barley malt", "red pepper flakes", "oregano", "red onion", "fresh basil"])
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Julia Exercism

Cater Waiter 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Julia 트랙을 개념 35개연습 문제 128개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.