Menu
Coddy logo textTech

인벤토리 스냅샷

Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 55번째.

해시, Enumerable 체인, group_by, 그리고 약간의 포매팅을 활용하는 재고 보고서입니다.

challenge icon

챌린지

중급

inventory 배열이 주어집니다. 각 항목은 :name, :category, :qty, :price를 키로 가지는 해시입니다.

다음 네 줄을 출력하세요:

  1. 모든 항목의 총 재고 가치(qty * price의 합계)를 정수로 출력합니다.
  2. 항목 수가 가장 많은 카테고리를 Top category: <name> (<count>) 형식으로 출력합니다. 항목 수가 같을 경우 카테고리 이름의 알파벳 순으로 결정합니다.
  3. 품절된 항목(qty == 0)의 이름을 알파벳 순으로 정렬하여 , 로 연결해 출력합니다. 품절된 항목이 없으면 (none)을 출력합니다.
  4. 단가가 가장 높은 상위 3개 항목의 이름을 가격이 높은 순서대로 , 로 연결해 출력합니다. 가격이 같을 경우 이름의 알파벳 순으로 결정합니다.

기본 inventory에 대한 출력 결과는 다음과 같습니다:

232
Top category: food (3)
milk
chair, lamp, milk

치트 시트

Enumerable 메서드를 사용하여 해시 배열 작업하기:

# 요소별 계산을 포함한 합계
inventory.sum { |item| item[:qty] * item[:price] }

# 키별로 그룹화하고 개수 세기
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }

# 필터링, 정렬 및 결합
inventory.select { |item| item[:qty] == 0 }
         .map { |item| item[:name] }
         .sort
         .join(", ")

# 여러 기준으로 정렬 (동일 순위는 알파벳순으로 처리)
inventory.sort_by { |item| [-item[:price], item[:name]] }
         .first(3)
         .map { |item| item[:name] }
         .join(", ")

개수와 함께 max_by를 사용할 때 동일 순위를 알파벳순으로 처리하기:

# 높은 개수가 우선이며, 동일할 경우 알파벳순으로 앞선 것 (max_by를 위해 문자열을 부정 처리)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# 또는 개수에 마이너스를 붙이고 자연스러운 문자열 순서를 사용하여 sort_by 수행
groups.sort_by { |cat, items| [-items.count, cat] }.first

직접 해보기

inventory = [
  { name: "apple",  category: "food",        qty: 10, price: 2 },
  { name: "bread",  category: "food",        qty: 4,  price: 3 },
  { name: "milk",   category: "food",        qty: 0,  price: 4 },
  { name: "chair",  category: "furniture",   qty: 2,  price: 35 },
  { name: "lamp",   category: "furniture",   qty: 5,  price: 20 },
  { name: "pencil", category: "stationery",  qty: 30, price: 1 }
]

# TODO: 총 가치, 상위 카테고리, 품절된 품목 이름, 가격순 상위 3개 항목 출력
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨