Menu
Coddy logo textTech

group_by와 partition

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

때로는 컬렉션을 필터링하기보다 split하고 싶을 때가 있습니다. 두 가지 메서드로 대부분의 유스케이스를 처리할 수 있습니다.

group_by는 블록을 받아 해시를 반환합니다. 블록의 각 고유한 반환 결과가 키가 되며, 해당 결과를 만들어낸 요소들의 배열로 매핑됩니다:

words = ["hi", "hello", "yo", "hey", "bonjour"]
by_length = words.group_by { |w| w.length }
puts by_length.inspect
# {2=>["hi", "yo"], 5=>["hello"], 3=>["hey"], 7=>["bonjour"]}

한 번의 패스로 항목을 분류하는 가장 깔끔한 방법입니다.

partition는 이진(binary) 버전입니다. 블록 조건이 true인 요소들과 나머지 요소들로 이루어진 한 쌍의 배열을 반환합니다:

evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect   # [2, 4]
puts odds.inspect    # [1, 3, 5]

버킷이 정확히 두 개일 때는 partition을 사용하고, 여러 개일 수 있을 때는 group_by를 사용하세요.

challenge icon

챌린지

중급

쉼표로 구분된 name:score 항목 목록(예: Alice:88,Bob:42,Charlie:75)을 읽습니다. group_by와 이어서 partition을 사용하여 간단한 리포트를 생성하세요.

단계:

  1. 각 항목을 [name, score] 쌍(score는 정수)으로 파싱합니다.
  2. namefirst 글자(대문자)로 group_by를 수행합니다.
  3. letter 그룹에 대해, alphabetical 순서대로 항목을 **합격**(score >= 60)과 **불합격**으로 partition한 후, 그룹당 한 줄씩 출력합니다:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

각 그룹 내에서 이름은 원래 순서대로 나타납니다. 한쪽에 이름이 없는 경우 비워 둡니다(예: fail=).

입력 Alice:88,Adam:42,Bob:75,Beth:55,Cara:90에 대한 출력은 다음과 같습니다:

A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=

직접 해보기

entries = gets.chomp.split(",").map do |s|
  name, score = s.split(":")
  [name, score.to_i]
end

# TODO: 첫 글자(대문자)로 그룹화하고, 각 그룹을 score >= 60으로 분할,
#       알파벳 글자 순서로 'X: pass=... fail=...'를 출력
quiz icon실력 점검

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

로직 및 흐름의 모든 레슨