Menu
Coddy logo textTech

해시 순회하기

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

해시(Hash)는 Enumerable이므로 배열처럼 순회할 수 있습니다. 필요한 것이 무엇인지에 따라 세 가지 일반적인 패턴이 있습니다.

each는 키와 값을 모두 전달합니다:

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

직접 해보기

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

# TODO: each를 통해 final-price 해시를 구축; 라인, 총계, 비싼 항목 출력
quiz icon실력 점검

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

로직 및 흐름의 모든 레슨