인벤토리 스냅샷
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 55번째.
해시, Enumerable 체인, group_by, 그리고 약간의 포매팅을 활용하는 재고 보고서입니다.
챌린지
중급inventory 배열이 주어집니다. 각 항목은 :name, :category, :qty, :price를 키로 가지는 해시입니다.
다음 네 줄을 출력하세요:
- 모든 항목의 총 재고 가치(
qty * price의 합계)를 정수로 출력합니다. - 항목 수가 가장 많은 카테고리를
Top category: <name> (<count>)형식으로 출력합니다. 항목 수가 같을 경우 카테고리 이름의 알파벳 순으로 결정합니다. - 품절된 항목(
qty == 0)의 이름을 알파벳 순으로 정렬하여,로 연결해 출력합니다. 품절된 항목이 없으면(none)을 출력합니다. - 단가가 가장 높은 상위 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개 항목 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.