트랙
/
Elixir
Elixir
/
연습 문제
/
도서관 요금
도서관 요금

도서관 요금

학습 연습 문제

소개

날짜와 시간

Elixir의 표준 라이브러리는 날짜와 시간을 다루기 위한 네 가지 모듈을 제공해요. 각 모듈에는 고유한 구조체가 있어요.

  • Date 모듈이에요. Date 구조체는 ~D 시길로 만들 수 있어요.

    ~D[2021-01-01]
    
  • Time 모듈이에요. Time 구조체는 ~T 시길로 만들 수 있어요.

    ~T[12:00:00]
    
  • 시간대가 없는 날짜와 시간을 위한 NaiveDateTime 모듈이에요. NaiveDateTime 구조체는 ~N 시길로 만들 수 있어요.

    ~N[2021-01-01 12:00:00]
    
  • 시간대가 있는 날짜와 시간을 위한 DateTime 모듈이에요. UTC가 아닌 시간대에 이 모듈을 사용하려면 외부 의존성인 시간대 데이터베이스가 필요해요.

비교

날짜나 시간을 서로 비교하려면 해당 모듈에서 compare나 diff 함수를 찾아보세요. ==, >, < 같은 비교 연산자가 작동하는 것처럼 보이지만, 이런 구조체에 대해서는 올바른 의미론적 비교를 하지 않아요.

지침

사서인 친구가 도서관 소프트웨어를 확장해서 연체료를 자동으로 계산해 달라고 부탁했어요. 현재 시스템은 책을 대출한 정확한 날짜와 시각을 ISO8601 날짜시간 문자열로 저장해요. 가나의 작은 마을에서 지역 도서관을 운영하는데, 이 도서관은 GMT 시간대(UTC +0)를 사용하고 서머타임을 적용하지 않으며 다른 시간대는 신경 쓸 필요가 없어요.

1. 저장된 날짜시간을 파싱해요

LibraryFees.datetime_from_string/1 함수를 구현해요. 이 함수는 ISO8601 날짜시간 문자열을 인자로 받아 NaiveDateTime 구조체를 반환해야 해요.

LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]

2. 책이 정오 전에 대출되었는지 확인해요

정오 전에 대출한 책은 28일 안에 반납해야 해요. 정오를 포함해 그 이후에 대출했다면 29일이에요.

LibraryFees.before_noon?/1 함수를 구현해요. 이 함수는 NaiveDateTime 구조체를 받아 불리언을 반환해야 해요.

LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true

3. 반납 날짜를 계산해요

대출 날짜시간을 기준으로 반납 날짜를 계산해요.

LibraryFees.return_date/1 함수를 구현해요. 이 함수는 NaiveDateTime 구조체를 받아 28일 또는 29일 뒤의 Date 구조체를 반환해야 해요.

LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]

4. 책의 반납이 얼마나 늦었는지 확인해요

도서관은 늦은 반납에 대해 정액 요금을 적용해요. 요금을 계산하려면 예정된 반납 날짜로부터 며칠 뒤에 실제로 반납했는지 알아야 해요.

LibraryFees.days_late/2 함수를 구현해요. 이 함수는 예정된 반납 날짜인 Date 구조체와 실제 반납 날짜시간인 NaiveDateTime 구조체를 받아야 해요.

실제 반납 날짜가 예정된 반납 날짜와 같거나 그보다 이르면 이 함수는 0을 반환해야 해요. 그렇지 않으면 두 날짜의 차이를 일 단위로 반환해야 해요.

도서관은 통계 목적으로 실제 반납 날짜와 시각을 모두 기록하지만, 연체료를 계산할 때는 시각을 사용하지 않아요.

LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7

5. 책이 월요일에 반납되었는지 확인해요

도서관은 월요일에 책을 반납하면 적용되는 특별 할인이 있어요.

LibraryFees.monday?/1 함수를 구현해요. 이 함수는 NaiveDateTime 구조체를 받아 불리언을 반환해야 해요.

LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false

6. 연체료를 계산해요

LibraryFees.calculate_late_fee/3 함수를 구현해요. 이 함수는 대출 날짜시간과 실제 반납 날짜시간이라는 두 개의 ISO8601 날짜시간 문자열, 그리고 하루치 연체료, 이렇게 세 개의 인자를 받아요. 실제 반납이 얼마나 늦었는지에 따라 총 연체료를 반환해야 해요.

월요일 특별 할인도 포함해요. 책을 월요일에 반납하면 연체료가 50% 할인되고, 소수점 이하는 버려요.

# Sunday, 7 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-03T13:30:45Z", 100)
# => 700

# one day later, Monday, 8 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-04T09:02:11Z", 100)
# => 400
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Elixir Exercism

도서관 요금 문제를 시작해 볼 준비가 됐나요?

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