문제

연도를 매개변수로 입력받아 그해가 윤년인지 아닌지를 True 또는 False로 반환하는 함수 is_leap_year()를 정의하라. 윤년이란 1년이 366일로 이뤄진 해이다. 윤년에는 2월이 28일까지가 아니라 29일까지 있다. 어떤 해가 윤년인지 아닌지를 판단하는 규칙은 다음과 같다.

코드

def is_leap_year(year):
    """연도를 입력받아 그 해가 윤년인지를 반환한다."""
    # - 그해의 수가 4로 나누어 떨어지면 윤년이다. 따라서 1996년은 윤년이다.
    if year % 4 == 0:
        # - 단, 그해의 수가 100로 나누어 떨어지면 윤년이 아니다. 따라서 1900년은 윤년이 아니다.
        if year % 100 == 0:
            # - 단, 그해의 수가 400으로 나누어 떨어지면 윤년이다. 따라서 2000년은 윤년이다.
            if year % 400 == 0:
                return True
            else:
                return False
        else:
            return True
    else:
        return False

# 함수의 동작 확인
print('1996년은 윤년인가?', is_leap_year(1996))
print('1900년은 윤년인가?', is_leap_year(1900))
print('2000년은 윤년인가?', is_leap_year(2000))
print('2020년은 윤년인가?', is_leap_year(2020))
print('2021년은 윤년인가?', is_leap_year(2021))

실행 결과

1996년은 윤년인가? True
1900년은 윤년인가? False
2000년은 윤년인가? True
2020년은 윤년인가? True
2021년은 윤년인가? False

해설

# 논리식을 정리하여 작성한 간결한 함수
def is_leap_year(year):
    """연도를 입력받아 그 해가 윤년인지를 반환한다."""
    return (year % 4 == 0) and (not (year % 100 == 0)) or (year % 400 == 0)