모임

모임

보통

소개

매달 파트너는 가장 친한 친구와 만나요. 둘 다 일정이 아주 바빠서 적당한 날짜를 잡기가 쉽지 않죠! 파트너는 나도 일정이 바쁜 걸 알기 때문에, 만날 만한 날짜를 항상 나와 다시 확인해요:

  • "다음 달 첫 번째 금요일에 만날 수 있을까?"
  • "세 번째 수요일은 어때?"
  • "마지막 일요일은 어때?"

이번 달 통화에서 파트너가 이렇게 물었어요:

  • "teenth 목요일에 만나고 싶은데, 괜찮을까?"

어리둥절해진 나는 "teenth" 날이 뭔지 물어봐요. 파트너는 스스로 만들어 낸 개념인 teenth 날은 한 달 중 '-teenth'로 끝나는 날을 가리킨다고 설명해요:

  • 13th (thirteenth)
  • 14th (fourteenth)
  • 15th (fifteenth)
  • 16th (sixteenth)
  • 17th (seventeenth)
  • 18th (eighteenth)
  • 19th (nineteenth)

요일도 일곱 개이기 때문에, 각 요일마다 매달 정확히 하나씩 teenth 날이 있다는 게 보장돼요.

이제 teenth 날의 개념을 이해했으니, 달력을 확인해요. teenth 목요일에는 아무 일정도 없어서, 기쁜 마음으로 파트너와 날짜를 확정해요.

지침

월, 연도, 요일, 주가 주어지면 모임의 정확한 날짜를 찾아야 해요.

고려할 주를 나타내는 값은 first, second, third, fourth, last, teenth 여섯 가지예요.

예를 들어, 2018년 1월의 첫 번째 월요일에 열리는 모임의 날짜를 찾으라는 문제가 나올 수 있어요 (2018년 1월 1일).

마찬가지로, 다음을 찾으라는 문제가 나올 수도 있어요:

  • 2019년 8월의 세 번째 화요일 (2019년 8월 20일)
  • 2020년 5월의 틴스 주 수요일 (2020년 5월 13일)
  • 2021년 7월의 네 번째 일요일 (2021년 7월 25일)
  • 2022년 11월의 마지막 목요일 (2022년 11월 24일)
  • 1953년 8월의 틴스 주 토요일 (1953년 8월 15일)

틴스

틴스 주는 한 달 중 '-teenth'로 끝나는 7일을 가리켜요 (13th, 14th, 15th, 16th, 17th, 18th, 19th).

1953년 8월의 틴스 주 토요일을 찾으라고 하면, 그 달의 달력을 확인해 봐요:

    August 1953
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

이로부터 틴스 주 토요일이 1953년 8월 15일이라는 것을 알 수 있어요.

Python에서 이 연습 문제가 구성되는 방식

한 달의 다섯 번째 요일이 있을 때를 위한 추가 서술자(fifth)를 넣었어요.
한 달에 다섯 번째 요일이 없으면 예외를 발생시켜야 해요.

예외를 사용자 정의하고 발생시키기

code에서 예외를 사용자 정의하고 raise해야 할 때가 있어요. 이럴 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 포함해야 해요. 그러면 code를 더 읽기 쉽게 만들고 디버깅에 큰 도움이 돼요.

사용자 정의 예외는 새로운 예외 클래스로 만들 수 있어요(자세한 내용은 classes를 참고해요). 이런 클래스는 보통 Exception의 서브클래스예요.

오류의 원인이 특정 예외 타입에서 파생된 것임을 알고 있는 상황이라면, Exception 클래스 아래에 있는 built in error types 중 하나를 상속받는 쪽을 선택할 수 있어요. 이때도 오류를 발생시킬 때는 의미 있는 메시지를 꼭 포함해야 해요.

이 연습 문제에서는 meetup() 함수에 유효하지 않은 요일 이름과 숫자 조합이 주어졌을 때 발생시키거나 "던질" _사용자 정의 예외_를 만들어야 해요. 테스트는 알맞은 예외를 사용자 정의하고, 그 예외를 raise하고, 알맞은 오류 메시지를 포함할 때만 통과해요.

built-in exception을 사용자 정의하려면 그 예외를 상속받는 class를 만들어요. 메시지와 함께 사용자 정의 예외를 발생시킬 때는 메시지를 exception 타입의 인자로 써요:

# subclassing the built-in ValueError to create MeetupDayException
class MeetupDayException(ValueError):
    """Exception raised when the Meetup weekday and count do not result in a valid date.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a MeetupDayException
raise MeetupDayException("That day does not exist.")

출처

Jeremy Hinegardner가 매달 'Wednesteenth'에 열리는 Boulder 모임을 언급했어요
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Python Exercism

모임 문제를 시작해 볼 준비가 됐나요?

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