Menu
Coddy logo textTech

Hash.new와 기본값

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

기본적으로, 해시에서 존재하지 않는 키를 조회하면 nil을 반환합니다:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default)은 이를 변경합니다. 누락된 모든 키는 전달한 값을 반환합니다:

scores = Hash.new(0)
puts scores["Alice"]   # 0

이것은 카운터를 작성하는 가장 깔끔한 방법입니다. 값을 증가시키기 전에 if scores[name].nil?을 확인할 필요가 없습니다:

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

중요: Hash.new(0)은 기본값을 0으로 설정하지만, 키를 읽을 때 해당 키를 저장하지는 않습니다. 해시는 값을 할당하기 전까지 비어 있는 상태를 유지합니다. 따라서 counts[letter] += 1을 작성하면, 키가 새로운 값과 함께 추가됩니다.

challenge icon

챌린지

쉬움

쉼표로 구분된 category:amount 항목 목록(예: food:12,gas:30,food:8,books:25,gas:15)을 읽습니다. Hash.new(0)를 사용하여 카테고리별 합계 해시를 생성한 다음, 합계가 최소 20 이상인 카테고리만 합계 기준 내림차순으로 정렬하여 한 줄에 하나씩 출력합니다:

<category>: <total>

위의 예시 입력에 대한 출력은 다음과 같습니다:

gas: 45
books: 25
food: 20

합계가 20에 도달하는 카테고리가 없으면 아무것도 출력하지 마십시오.

치트 시트

기본적으로, 존재하지 않는 해시 키는 nil을 반환합니다. 대신 다른 기본값을 반환하려면 Hash.new(default)를 사용하세요:

scores = Hash.new(0)
puts scores["Alice"]   # 0

이 방식은 카운터를 깔끔하게 만들어 줍니다 — 값을 증가시키기 전에 nil 여부를 확인할 필요가 없습니다:

counts = Hash.new(0)
["a", "b", "a"].each do |letter|
  counts[letter] += 1
end
# {"a"=>2, "b"=>1}

참고: 존재하지 않는 키를 읽는 것만으로는 해당 키가 저장되지 않습니다. 키는 값을 할당할 때만 추가됩니다 (예: +=).

직접 해보기

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); 카테고리별 금액 누적;
#       그 다음 합계가 20 이상인 카테고리를 합계 기준 내림차순으로 정렬하여 출력
quiz icon실력 점검

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

로직 및 흐름의 모든 레슨