트랙
/
R
R
/
연습 문제
/
새 관찰자
새 관찰자

새 관찰자

학습 연습 문제

소개

R에서 큰 개념이에요. 가능한 것들을 이해하는 데 도움이 되도록, 여러 함수의 입력과 출력이 몇 차원인지 생각해 보면 유용해요.

벡터 입력, 스칼라 출력

벡터를 받아 하나의 스칼라 같은 값을 반환하는 함수는 이미 봤어요:

> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15

mean()처럼 많은 통계 함수도 여기에 속해요.

논리 벡터에는 all()과 any()가 있어요.

벡터 입력, 벡터 출력

R의 많은 함수는 벡터 전체에 작동하며, 흔히 벡터를 결과로 내놓아요. 대부분의 수학 함수가 그렇죠:

> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5

이런 방식은 간결하고 편리할 뿐만 아니라, 다른 언어에서 흔히 쓰는 루프나 리스트 컴프리헨션, 재귀를 쓸 필요도 없어요. R에서는 벡터 함수가 그런 기법보다 훨씬 빠르게 실행되는 경우가 많아요.

벡터를 정렬할 때는 값을 반환하는 sort()와 인덱스를 반환하는 order()가 있어요:

> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am"    "I"     "in"    "not"   "order"
> order(v)
#> [1] 2 1 4 3 5

기본값은 오름차순 정렬이에요. 필요하면 decreasing = TRUE를 지정하거나, 기존 벡터를 뒤집을 때는 rev()를 사용해요.

v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not"   "in"    "I"     "am"

rev(1:4)
#> [1] 4 3 2 1

입력 벡터를 왼쪽에서 오른쪽으로 처리하면서 누적된 값을 벡터로 만들어 주는 함수도 있어요:

> cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
> cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

여러 벡터 입력, 벡터 출력

이 개념을 확장하면 벡터를 비교할 때도 활용할 수 있어요. 예를 들어 각 쌍의 최댓값을 구하는 함수 pmax()를 살펴봐요:

> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

지침

지난 7일 동안 정원에 찾아온 새가 몇 마리인지 기록해 온 열렬한 탐조가예요.

앞으로 풀어야 할 과제는 여섯 개이고, 모두 정원에 찾아온 새의 수와 관련된 내용이에요.

1. 오늘 몇 마리의 새가 찾아왔는지 확인하기

today() 함수를 구현해요. 이 함수는 오늘 정원에 찾아온 새가 몇 마리인지 반환해요. 새의 수는 날짜 순으로 정렬되어 있어요. 첫 번째 원소는 가장 오래된 날의 수이고, 마지막 원소는 오늘의 수예요.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1

2. 오늘의 수 늘리기

increment_todays_count() 함수를 구현해 오늘의 수를 늘려요:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)

3. 새가 찾아오지 않은 날이 있었는지 확인하기

has_day_without_birds() 함수를 구현해요. 정원에 새가 한 마리도 찾아오지 않은 날이 있으면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환해요:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true

4. 첫 며칠 동안 찾아온 새의 수 계산하기

count_for_first_days() 함수를 구현해요. 이 함수는 이번 주가 시작된 이후 정원에 찾아온 새의 수를 반환하되, 세는 범위는 이번 주 시작부터 지정한 일수까지만으로 제한해요.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14

5. 바쁜 날의 수 계산하기

어떤 날은 다른 날보다 더 바빠요. 바쁜 날은 정원에 다섯 마리 이상의 새가 찾아온 날이에요. busy_days() 함수를 구현해 바쁜 날의 수를 반환해요:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2

6. 지난 한 주 동안의 새 방문 누적 합계 계산하기

이번 주에 지금까지 새가 모두 몇 마리 찾아왔는지 궁금해요. 날짜별 누적 합계를 계산해요.

running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1]  7 13 18 22 25 27 28

7. 바쁜 정도에 따라 요일 이름 정렬하기

새의 방문이 근처 도로 교통 패턴의 영향을 받아서, 주말과 평일이 서로 다르다고 생각해요.

방문한 새의 수를 기준으로 요일 약어를 _내림차순_으로 정렬해요.

day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
R Exercism

새 관찰자 문제를 시작해 볼 준비가 됐나요?

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