[Project Euler] Problem 19

원문: Problem 19
You are given the following information, but you may prefer to do some research for yourself.
  • 1 Jan 1900 was a Monday.
  • Thirty days has September,
    April, June and November.
    All the rest have thirty-one,
    Saving February alone,
    Which has twenty-eight, rain or shine.
    And on leap years, twenty-nine.
  • A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.
How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

아래와 같은 정보가 주어졌으나 스스로 몇 가지 조사를 하는 것이 좋을 것이다.
  • 1900년 1월 1일은 월요일이었다.
  • 30일을 가진 월은 9월,
    4월, 6월 그리고 11월이다.
    나머지 월들은 31일을 가졌고,
    비가 오나 눈이 오나,
    2월 혼자서 28일을 가졌다.
    그리고 윤년에서는 29일이다.
  • 윤년은 4로 정확히 나누어지는 모든 해마다 발생하지만, 400으로 나누어지지 않는 1세기마다 발생하지 않는다.
20세기 동안 월의 첫 번째 날이 일요일인 경우가 얼마나 많은가?(1901년 1월 1일부터 2000년 12월 31일까지)

문제를 풀 때 주의해야 할 점은 1900년 1월 1일이 월요일이고 1901년 1월 1일부터 계산을 시작한다. 절대 헷갈리지 말자.(나 같은 경우에는 헷갈렸다. ㅜㅜ)

Python
>>> days = {1 : 31, 2 : 28, 3 : 31, 4 : 30, 5 : 31, 6 : 30, 7 : 31, 8 : 31, 9 : 30, 10 : 31, 11 : 30, 12 : 31}
>>> def calc(year) :
    total = 0
    num = 0
    for n in range(year) :
        if (n+1)%48==38 and (n+1)%1200 != 1190 :
            total += days[n%12+1]+1
        else :
            total += days[n%12+1]
        if total%7 == 6 :
            num += 1
    else :
        if total%7 == 6 :
            num -= 1
        return num
   
>>> calc(1212) - calc(12)
접기


하지만 모듈을 잘 안다면 훨씬 더 간단하게 할 수도 있다.

Python 2
>>> from datetime import date
>>> print sum(1 for year in xrange(1901, 2001) for month in xrange(1, 13) if date(year, month, 1).weekday() == 6)
접기

댓글 없음:

댓글 쓰기