파이썬_실전 프로젝트

# 프로젝트 오일러 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 year % 100 != 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 year % 100 != 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 year % 100 != 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을 빼줘야 합니다.

### 댓글

댓글 본문
작성자
비밀번호
아,, 오타군요 ^^ 감사합니다. year % 100 != 0 입니다. 띄어쓰기를 안하고 쓰니깐,, year0 != 0 이렇게 되네요. 뭔가 공격코드 같은걸로 인식하는듯 합니다.
대화보기
• 나바자
if month[0]=='Feb' and year%4==0 and year0!=0:
NameError: name 'year0' is not defined

으로 에러가 나네요.. ㅠㅠ
버전 관리