트랙
/
F#
F#
/
연습 문제
/
새 관찰자
새 관찰자

새 관찰자

학습 연습 문제

소개

배열

F#의 array는 길이가 고정된, 0개 이상의 값으로 이루어진 변경 가능한 컬렉션이에요. 즉, 배열을 한 번 만들면 크기는 바꿀 수 없지만 값은 바꿀 수 있어요. 배열 안의 값은 모두 같은 타입이어야 해요. 배열은 다음과 같이 정의할 수 있어요:

let empty = [| |]
let emptyAlternative = Array.empty

let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5

let threeValues = [| "a"; "b"; "c" |]

인덱스를 사용해 배열에 원소를 할당하거나 배열에서 원소를 가져올 수 있어요. F# 배열은 0부터 시작해요. 즉, 첫 번째 원소의 인덱스는 항상 0이에요:

let numbers = [| 2; 3; 5 |]

// Update value in array
numbers[2] <- 9

// Read value from array
numbers[2]
// => 9

배열은 Array 모듈에 정의된 함수와 연산자로 다루거나, array 패턴을 사용한 패턴 매칭으로 직접 다룰 수 있어요:

let describe array =
    match array with
    | [| |] -> "Empty"
    | [| 1; 2; three |] -> sprintf "1, 2, %d" three
    | _ -> "Other"

describe [| |]         // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"

패턴 매칭을 할 때 값을 버릴 수도 있어요. 특정 경우에 값에 관심이 없을 때(즉, 값을 _사용_하지 않을 때)는 밑줄('_')을 사용해 이를 나타낼 수 있어요:

let describe array =
    match array with
    | [| |] -> "Empty array"
    | [| x |] -> "Array with one item"
    | [| _; y |] -> "Array with two items (first item ignored)"
    | _ -> "Array with many items (all items ignored)"

describe [| |]          // => "Empty array"
describe [| 1 |]        // => "Array with one item"
describe [| 5; 7 |]     // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |]  // => "Array with many items (all items ignored)"

패턴 매칭에서 '_'는 항상 _마지막_에 와야 해요. 다른 어떤 경우와도 일치하지 않는 값은 모두 이 경우에서 처리돼요.

지침

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

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

1. 지난주 기록이 어땠는지 확인하기

비교를 위해 지난주 기록을 항상 가까이에 복사해 두는데, 그 값은 0, 2, 5, 3, 7, 8, 4예요. 지난주 기록을 담은 lastWeek 바인딩을 정의해요:

lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]

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

yesterday 함수를 구현해서 어제 정원을 찾아온 새의 수를 반환해요. 새 기록은 날짜 순으로 정렬되어 있고, 첫 번째 원소는 가장 오래된 날의 기록, 마지막 원소는 오늘의 기록이에요.

yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4

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

total 함수를 구현해서 정원을 찾아온 새의 총 마릿수를 반환해요:

total [| 3; 5; 0; 7; 4; 1 |]
// => 20

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

dayWithoutBirds 함수를 구현해요. 정원에 새가 한 마리도 찾아오지 않은 날이 있다면 true를, 그렇지 않으면 false를 반환해요:

dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true

5. 오늘 기록 증가시키기

incrementTodaysCount 함수를 구현해서 오늘의 기록을 하나 늘리고 갱신된 기록을 반환해요:

let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]

6. 특이한 주인지 확인하기

지난 한 해 동안, 몇몇 주가 다음과 같은 동일한 특이한 패턴을 보인다는 것을 알게 됐어요:

  • 주의 짝수 번째 날마다 새가 한 마리도 없었어요
  • 주의 짝수 번째 날마다 정확히 새 10마리가 관찰됐어요
  • 주의 홀수 번째 날마다 정확히 새 5마리가 관찰됐어요

이번 주의 새 기록 패턴이 이 특이한 패턴 중 하나와 일치하면 true를 반환하는 unusualWeek 함수를 구현해요:

unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true

unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true

(날짜의 홀짝은 0부터가 아니라 1부터 시작해요. 배열의 첫 번째 원소가 홀수 번째 날에 해당해요)

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
F# Exercism

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

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