파이썬_실전 프로젝트

프로젝트 오일러 19번문제 - 일요일의 갯수

1901년 1월 1일부터 2000년 12월 31까지 매달 1일이 일요일인 날수를 개산하는 문제입니다.

 

Counting Sundays

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)?

 

매월말까지 날짜를 계속 누적해가면서, 7로 나누어 떨어지는지 확인하면, 다음달 1일은 특정한 요일(초기값에 따라 다름)로 시작하는지 알수있겠네요.

윤달은 조건문으로 적당히 계산해주구요.

 

월 List
months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
for month in months:
    print(month)
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec

 

월 List (named list)
months = [('Jan',31),('Feb',28),('Mar',31),('Apr',30),('May',31),('Jun',30),('Jul',31),('Aug',31),('Sep',30),('Oct',31),('Nov',30),('Dec',31)]
for month in months:
    print(month,month[0],month[1])
('Jan', 30) Jan , 30
('Feb', 28) Feb , 28
('Mar', 31) Mar , 31
('Apr', 30) Apr , 30
('May', 31) May , 31
('Jun', 30) Jun , 30
('Jul', 31) Jul , 31
('Aug', 31) Aug , 31
('Sep', 30) Sep , 30
('Oct', 31) Oct , 31
('Nov', 30) Nov , 30
('Dec', 31) Dec , 31

 

연도 List
for year in range(1900,2001):
    print(year)
1900
1901
1902
1903
1904
1905
1906
1907
...
...
1994
1995
1996
1997
1998
1999
2000

 

전체 연월
months = [('Jan',31),('Feb',28),('Mar',31),('Apr',30),('May',31),('Jun',30),('Jul',31),('Aug',31),('Sep',30),('Oct',31),('Nov',30),('Dec',31)]
for year in range(1900,2001):
    for month in months:
        print(year,month[0],month[1])
1900 Jan 31
1900 Feb 28
1900 Mar 31
1900 Apr 30
1900 May 31
1900 Jun 30
1900 Jul 31
1900 Aug 31
...
...
2000 Mar 31
2000 Apr 30
2000 May 31
2000 Jun 30
2000 Jul 31
2000 Aug 31
2000 Sep 30
2000 Oct 31
2000 Nov 30
2000 Dec 31

 

윤달계산
months = [('Jan',31),('Feb',28),('Mar',31),('Apr',30),('May',31),('Jun',30),('Jul',31),('Aug',31),('Sep',30),('Oct',31),('Nov',30),('Dec',31)]
for year in range(1900,2001):
    for month in months:
        if month[0]=='Feb' and year%4==0 and year0!=0:
            print(year,month[0],month[1]+1,"leap year")
        else :
            print(year,month[0],month[1])
1900 Jan 31
1900 Feb 28
1900 Mar 31
1900 Apr 30
1900 May 31
...
...
1903 Dec 31
1904 Jan 31
1904 Feb 29 leap year
1904 Mar 31
1904 Apr 30
...
...
1907 Dec 31
1908 Jan 31
1908 Feb 29 leap year
1908 Mar 31
1908 Apr 30
...
...

 

1일이 일요일인 날수 계산
sundayCount = 0
totalDay = 0
months = [('Jan',31),('Feb',28),('Mar',31),('Apr',30),('May',31),('Jun',30),('Jul',31),('Aug',31),('Sep',30),('Oct',31),('Nov',30),('Dec',31)]
for year in range(1900,2001):
    for month in months:
        if month[0]=='Feb' and year%4==0 and year0!=0:
            print(year,month[0],month[1]+1,"leap year")
            totalDay=totalDay+month[1]+1
        else :
            print(year,month[0],month[1])
            totalDay=totalDay+month[1]
        print(totalDay,(totalDay-6)%7)
1900 Jan 31
31 4
1900 Feb 28
59 4
1900 Mar 31
90 0
1900 Apr 30
120 2
1900 May 31
151 5
1900 Jun 30
181 0
...

1900년 1월1일이 월요일이기 때문에, 날짜합계에 6을 빼주고, 7로 나누면, 0으로 떨어질때 다음날이 일요일입니다. 꼭 6을 안빼주어도, 7로 나누었을때 출력된 결과를 보면서 일정한 규칙성만 찾아내면 됩니다.

 

최종코드
sundayCount = 0
totalDay = 0
months = [('Jan',31),('Feb',28),('Mar',31),('Apr',30),('May',31),('Jun',30),('Jul',31),('Aug',31),('Sep',30),('Oct',31),('Nov',30),('Dec',31)]
for year in range(1900,2001):
    for month in months:
        if month[0]=='Feb' and year%4==0 and year0!=0:
            print(year,month[0],month[1]+1,"leap year")
            totalDay=totalDay+month[1]+1
        else :
            print(year,month[0],month[1])
            totalDay=totalDay+month[1]
        print(totalDay,(totalDay-6)%7)
        if (totalDay-6)%7 == 0 and year>1900:
            sundayCount+=1
print(sundayCount)
print(sundayCount-1) 
1900 Jan 31
31 4
1900 Feb 28
59 4
1900 Mar 31
90 0
1900 Apr 30
120 2
1900 May 31
151 5
1900 Jun 30
181 0
1900 Jul 31
212 3
1900 Aug 31
243 6
1900 Sep 30
273 1
...
...
2000 Jun 30
36705 5
2000 Jul 31
36736 1
2000 Aug 31
36767 4
2000 Sep 30
36797 6
2000 Oct 31
36828 2
2000 Nov 30
36858 4
2000 Dec 31
36889 0
172
171

마지막 2000년 12월이 7로 나누어 떨어지는데, 이는 2001년 1월1일이 일요일이라는 의미라서, 계산범위를 벗어나기 때문에, 1을 빼줘야 합니다.

댓글

댓글 본문
작성자
비밀번호
버전 관리
code builder
현재 버전
선택 버전
graphittie 자세히 보기