트랙
/
jq
jq
/
연습 문제
/
새 세기
새 세기

새 세기

학습 연습 문제

소개

배열

JSON은 배열을 이렇게 정의해요.

배열은 값들을 순서대로 모아 놓은 집합이에요. 배열은 [ 왼쪽 대괄호로 시작하고 ] 오른쪽 대괄호로 끝나요. 값들은 , 쉼표로 구분해요.

배열에는 _어떤 종류_의 JSON 값이든 0개 이상 담을 수 있어요. 배열의 원소가 모두 같은 타입일 필요는 없어요.

배열 만들기

대괄호를 사용해서 원소들을 배열로 모아요.

[1, 2, 3]

_스트림_의 원소들은 대괄호로 감싸서 배열로 담을 수 있어요.

range(5)     # => a stream of 5 numbers
[range(5)]   # => the array [0, 1, 2, 3, 4]

크기

length 함수는 배열에 들어 있는 원소의 개수를 반환해요.

인덱싱과 슬라이싱

배열의 인덱스는 0부터 시작해요.

대괄호 표현식으로 배열에서 원소를 가져올 수 있어요. .[2]는 세 번째 원소를 가져와요.

음수 인덱스는 배열의 끝에서부터 거꾸로 세요. .[-1]은 마지막 원소를, .[-2]는 끝에서 두 번째 원소를 가져와요.

슬라이스는 배열의 일부 연속된 구간이에요. .[10:15]는 인덱스 10부터 시작하는 원소 5개를 반환해요. 끝 인덱스는 포함되지 않아요.

편의를 위한 함수도 몇 가지 있어요.

  • first는 첫 번째 원소를 가져와요.
  • last는 마지막 원소를 가져와요.
  • nth(n)은 인덱스 n에 있는 원소를 가져와요.

반복하기

jq는 자주 쓰는 반복 기능을 위한 다양한 함수를 제공해요.

  • map(expr)은 expr을 각 원소에 차례대로 적용한 새로운 배열을 반환해요.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr)은 _하나의 값_에 expr을 적용하는 함수예요. 표현식의 결과가 참이면 그 값을 반환하고, 거짓이면 아무것도 반환하지 않아요. null이 아니라 정말로 아무것도 반환하지 않아요.

    이걸 배열에 적용하려면 map과 함께 사용해요.

    [range(10)] | map(select(. % 2 == 0))    # => [0, 2, 4, 6, 8]
    

    또는 select를 _스트림_에 적용하고 그 결과를 모을 수도 있어요.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition)와 all(condition)은 배열의 원소 중 조건을 통과하는 것이 있는지, 또는 모두 통과하는지를 불리언 값으로 반환해요.

    [1, 2, 3, 4] | any(. > 4)    # false
    [1, 2, 3, 4] | any(. >= 4)   # true
    
    [1, 2, 3, 4] | all(. >= 4)   # false
    [1, 2, 3, 4] | all(. <= 4)   # true
    

지침

지난 7일 동안 정원에 몇 마리의 새가 찾아왔는지 기록하는 열렬한 새 관찰자예요.

정원을 찾아온 새의 수를 다루는 다섯 가지 과제가 있어요.

1. 지난주 기록 확인하기

새 개수는 JSON 형식으로 저장해요. "main" 배열은 주별 기록들의 배열을 담고 있어요. 각 주별 기록은 일곱 개의 정수로 이루어진 배열이고, 요일마다 숫자가 하나씩 들어 있어요. 새로운 주는 항상 main 배열의 끝에 추가해요. 지난주 기록을 반환하는 필터를 구현해요.

$ cat bird-counting-data.json
[
  ...,
  [0, 2, 5, 3, 7, 8, 4],
  [4, 5, 9, 10, 9, 4, 3]
]

$ jq -f bird-count.jq < bird-counting-data.json
{
  "last_week": [0, 2, 5, 3, 7, 8, 4],
  ...

2. 어제 몇 마리의 새가 찾아왔는지 확인하기

어제 정원에 몇 마리의 새가 찾아왔는지 반환하는 필터를 구현해요. 새 개수는 날짜 순으로 정렬되어 있어요. 첫 번째 원소는 가장 오래된 날의 개수이고, 마지막 원소는 오늘의 개수예요.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "yesterday": 4,
  ...

3. 찾아온 새의 총 마릿수 계산하기

이번 주에 정원을 찾아온 새의 총 마릿수를 반환하는 필터를 구현해요.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "total": 44,
  ...

4. 바쁜 날의 수 계산하기

어떤 날은 다른 날보다 더 바빠요. 바쁜 날이란 정원에 다섯 마리 이상의 새가 찾아온 날이에요. 이번 주의 바쁜 날 수를 반환하는 필터를 구현해요.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "busy_days": 4,
  ...

5. 새가 한 마리도 찾아오지 않은 날이 있었는지 확인하기

이번 주에 정원에 새가 한 마리도 찾아오지 않은 날이 있으면 true를 반환하고, 그렇지 않으면 false를 반환하는 필터를 구현해요.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
jq Exercism

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

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