본문 바로가기
프로그램

[파이썬] 문제 : 년,월 입력 받아서 달력 출력

by 오디세이99 2023. 4. 7.
728x90
반응형
from datetime import datetime, date, timedelta
from dateutil import relativedelta

def getDay(date):                  # 요일 찾기 함수
    days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    day = date.weekday()           # 요일 번호 (0:일요일, 1:월요일...6:토요일)
    return day, days[day]         # 요일 번호와 요일명 return


def getDate(year, month):                         # 그 달의 첫번째 날짜와 마지막 날짜 함수
    first_day = date(int(year), int(month), 1)    # 요일을 찾음(함수 사용)
    day_idx, day_name = getDay(first_day)         # 1일의 요일 찾기. 요일 번호, 요일명

    next_month = first_day + relativedelta.relativedelta(months=1)   # 첫날(datetime)에서 1개월을 더하면 다음달의 첫번째 날짜
    last_day = next_month - timedelta(days=1)                        # 다음 달의 첫번째 날짜에서 -1 day 를 하면 이번달의 마지막 날짜

    return first_day, last_day                    # 첫날, 마지막날 return


year, month = map(int, input('년, 월을 입력하세요(2023-3) : ').split('-'))   # 년,월을 입력 받음. 양식은 yyyy-mm

first_day, last_day = getDate(year, month)         # 함수 사용. 그해 년도, 월에 첫번째 날짜와 마지막 날짜

print('=' * 28)                                    # '='를 28개 출력
print('         {0:4d}년{1:2d}월'.format(year, month)) # 년, 월 출력
print('=' * 28)
print(' 일  월  화  수  목  금  토 ')              # 요일명 출력
print('=' * 28)

print('    '*(day_idx+1), end='')                  # 1일 앞 요일들 공백 2씩 으로 채우기
pos = day_idx + 1                                  # 날짜(1,2,3,..)가 어느 위치에 있어서 하는지 구분 변수. 첫음은 1일의 요일 번호
i = 0                                              # 날짜(1,2,3...) 번호
while True:                                       # 반복문. 아래 break에서 종료
    i += 1                                         # 날짜 1 씩 증가.
    pos += 1                                       # 날짜 위치 1씩 증가
    print(' {0:2d} '.format(i), end = '')          # 날짜(1,2,3..)을 정수 2자리로 출력. 이때 줄바꿈 하지 않음
    
    if pos%7 == 0:                                 # 출력 날짜의 위치가 7의 배수면 줄바꿈
        print()
    if i == last_day.day:                          # 마지막 날짜의 일(30, 31 등)
        break                                      # 종료
print('\n' + '=' * 28)                              # 달력 하단 부분.

728x90
반응형

댓글