# 주어진 연도와 월에 대한 달력을 출력한다.
def printMonth(year, month):
# 타이틀 출력
printMonthTitle(year, month)
# 달력의 몸체 출력
printMonthBody(year, month)
# 달력의 제목을 출력한다.
def printMonthTitle(year, month):
print(" ", getMonthName(month), " ", year)
print("------------------------------------")
print(" Sun Mon Tue Wed Thu Fri Sat")
def getMonthName(month):
monthList = ["January", "February", "March", "April", "May", "June", "July",
"August", "September" "October", "November" "December"]
return monthList[month-1]
def printMonthBody(year, month):
# 주어진 월의 첫번째 일에 대한 시작 요일을 구한다.
startDay = getStartDay(year, month)
# 월의 일수를 구한다.
numberOfDaysInMonth = getNumberOfDaysInMonth(year, month)
# 월의 첫번째 날 앞에 공백을 삽입
i = 0
for i in range(0, startDay):
print(" ", end=" ")
for i in range(1, numberOfDaysInMonth + 1):
print(format(i, "4d"), end=" ")
if(i + startDay) % 7 == 0:
print() # 줄 바꿈
# 주어진 년월일의 시작 요일을 구한다.
def getStartDay(year, month):
START_DAY_FOR_JAN_1_1800 = 3
# 총 일수 구하기
totalNumberOfDays = getTotalNumberOfDays(year, month)
return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7
def getTotalNumberOfDays(year, month):
total = 0
# 1800년부터 입력된 년도의 1월 1일까지 모든 일수를 구한다.
for i in range(1800, year):
if isLeapYear(i):
total += 366
else:
total += 365
# 당해의 1월부터 이전월까지의 모든 일수를 더한다.
for i in range(1, month):
total = total + getNumberOfDaysInMonth(year, i)
return total
# 입력된 년도가 운년인지 확인
def isLeapYear(year):
return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)
# 해당 월의 총 일수를 계산한다.
def getNumberOfDaysInMonth(year, month):
if(month == 1 or month == 3 or month == 5 or month == 7 or
month == 8 or month == 10 or month == 12):
return 31
if month == 4 or month == 6 or month == 9 or month == 11:
return 30
if month == 2:
if isLeapYear(year):
return 29
else :
return 28
return 0 # 잘못된 월일 경우
def main():
# 사용자로부터 연도와 월을 입력 받는다.
year = eval(input("연도를 입력하세요(예: 2019): "))
month = eval(input("월을 입력하세요(1~12): "))
printMonth(year, month)
main()
# 연도를 입력하세요(예: 2019): 2019
# 월을 입력하세요(1~12): 1
# January 2019
# ------------------------------------
# Sun Mon Tue Wed Thu Fri Sat
# 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