Menu
Coddy logo textTech

해시 순회하기

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

해시는 열거 가능하므로, 배열과 마찬가지로 반복할 수 있습니다. 원하는 바에 따라 세 가지 일반적인 패턴이 있습니다.

each는 키(key)와 값(value)을 모두 제공합니다:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key는 키만 순회합니다:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value는 값들만 순회합니다:

prices.each_value { |v| puts v }   # 1, 3, 4

그리고 지난 장에서 보았던 모든 Enumerable 메서드인 map, select, reduce는 해시에서도 작동합니다. 반복할 때마다 키/값 쌍(또는 요소가 2개인 배열)을 받게 됩니다:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

챌린지

중급

가격 목록에 세일을 적용하려고 합니다. 해시 prices가 주어집니다 (아이템 심볼 => 가격 정수).

한 줄의 입력을 읽으세요: 50% 할인할 아이템의 쉼표로 구분된 목록입니다 (해시의 심볼 이름과 일치함).

다음 순서대로 출력하세요:

  1. 아이템당 한 줄씩 <item>: <item>: $<final_price>lt;final_price> 형식으로 출력합니다. 여기서 최종 가격은 아이템이 할인 목록에 있으면 할인된 가격이고, 그렇지 않으면 원래 가격입니다. each를 사용하여 반복하세요. 아이템은 원래 순서를 유지합니다. 할인 계산 시 정수 나눗셈을 사용하세요 (price / 2).
  2. Was: Was: $<n>lt;n>: 원래 총합 (values.sum 사용)
  3. Now: Now: $<n>lt;n>: 할인 적용 후 총합
  4. 최종 가격이 여전히 2보다 큰 아이템들의 이름을 , 로 연결하여 출력하세요 (새 해시에서 select + keys 사용)

기본 해시에서 입력이 bread,milk인 경우, 출력은 다음과 같습니다:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

치트 시트

each, each_key, each_value를 사용하여 해시를 반복 처리하기:

prices = { apple: 1, bread: 3, milk: 4 }

prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }

map, select, reduce와 같은 Enumerable 메서드도 해시에서 작동하며, 반복마다 키/값 쌍을 받습니다:

prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }

유용한 해시 메서드: 모든 값을 더하는 .values.sum, 키 배열을 가져오는 .keys.

직접 해보기

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: each를 사용하여 최종 가격 해시를 생성하고, 각 항목, 합계, 비싼 품목을 출력하세요.
quiz icon실력 점검

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

로직 및 흐름의 모든 레슨