새 세기

새 세기

학습 연습 문제

소개

배열

Ruby에서 배열은 모든 종류의 객체를 담을 수 있는, 순서가 있고 정수 인덱스로 접근하는 컬렉션이에요. 배열의 인덱스는 0부터 시작해요. 음수 인덱스는 배열의 끝을 기준으로 세요. 예를 들어 인덱스 -1은 배열의 마지막 원소를, -2는 끝에서 두 번째 원소를 가리키고, 이런 식으로 이어져요.

배열 만들기

배열은 보통 [] 표기법으로 만들어요. 서로 다른 타입의 객체를 얼마든지 담을 수 있어요.

array = [1, "two", 3.0]

원소 참조

배열의 원소는 #[] 메서드를 사용해 인덱스로 가져올 수 있어요. 이 메서드는 해당 인덱스의 원소를 반환하거나, 시작 인덱스에서부터 지정한 길이만큼 이어지는 부분 배열을 반환해요. 음수 인덱스는 배열의 끝에서부터 거꾸로 세요.

a = [ "a", "b", "c", "d", "e" ]

a[2]       #=> "c"
a[6]       #=> nil
a[1, 3]    #=> [ "b", "c", "d" ]

a[-1]      #=> "e"
a[-2]      #=> "d"
a[-3, 2]   #=> ["c", "d"]

헬퍼 메서드

배열에는 유용한 헬퍼 메서드가 많이 있어요. 그중 자주 쓰이는 몇 가지를 소개할게요.

fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]

fibonacci.size      #=> 8
fibonacci.sum       #=> 33
fibonacci.reverse   #=> [13, 8, 5, 3, 2, 1, 1, 0]

열거

컬렉션을 순회할 때 루프를 쓰는 대신, Ruby에서는 열거를 사용해요.

열거는 컬렉션(여기서는 배열)을 하나씩 훑으면서 각 객체에 어떤 작업을 하는 거예요. 열거는 Ruby의 핵심 개념이고, 정렬, 그룹화, 매핑, 축소 등 여러 곳에서 쓰여요.

배열의 각 단어를 출력하는 열거는 다음과 같아요.

words = ["the", "cat", "sat"]
words.each do |word|
  puts word
end

# Output:
# the
# cat
# sat

이 예제에서는 배열에 .each 메서드를 호출하고, 매개변수 하나(word)를 받아 출력하는 _블록_을 넘겼어요.

_블록_은 이후 트랙에서 훨씬 자세히 다뤄요. 지금은 인자를 0개 이상 받을 수 있는 익명 함수 정도로 생각해 둬요. 블록은 (위에서 본) do...end 문법으로 정의할 수도 있고, (아래에서 볼) {} 문법으로 정의할 수도 있어요.

블록을 사용하는 배열 메서드의 다른 예시도 있어요.

fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]

fibonacci.count  { |number| number == 1 }   #=> 2
fibonacci.any?   { |number| number == 6 }   #=> false
fibonacci.select { |number| number.odd? }   #=> [1, 1, 3, 5, 13]
fibonacci.all?   { |number| number < 20 }   #=> true
fibonacci.map    { |number| number * 2  }   #=> [0, 2, 2, 4, 6, 10, 16, 26]

지침

지난 7일 동안 정원을 찾은 새의 수를 기록하는 열렬한 조류 관찰자예요.

정원을 찾은 새의 수를 다루는 다섯 개의 과제가 있어요.

1. 지난주 집계 확인하기

비교를 위해 지난주 집계 사본을 항상 가까이에 보관하는데, 그 값은 0, 2, 5, 3, 7, 8, 4였어요. 지난주 집계를 반환하는 BirdCount.last_week 메서드를 구현해요:

BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]

2. 어제 몇 마리의 새가 방문했는지 확인하기

어제 정원을 찾은 새의 수를 반환하는 BirdCount#yesterday 메서드를 구현해요. 새 집계는 날짜순으로 정렬되어 있고, 첫 번째 원소는 가장 오래된 날의 집계이고, 마지막 원소는 오늘의 집계예요.

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4

3. 방문한 새의 총 마릿수 계산하기

정원을 찾은 새의 총 마릿수를 반환하는 BirdCount#total 메서드를 구현해요:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19

4. 바쁜 날의 수 계산하기

어떤 날은 다른 날보다 더 바빠요. 바쁜 날은 새가 다섯 마리 이상 정원을 찾은 날이에요. 바쁜 날의 수를 반환하는 BirdCount#busy_days 메서드를 구현해요:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2

5. 새가 방문하지 않은 날이 있었는지 확인하기

정원을 찾은 새가 한 마리도 없는 날이 있었다면 true를 반환하고, 그렇지 않으면 false를 반환하는 BirdCount#day_without_birds? 메서드를 구현해요:

birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Ruby Exercism

새 세기 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.