Python

제라의 공식으로 달력 만들기

seyeon1130 2025. 4. 2. 20:59
윤년, 평년 판별식
# 1. 윤년 판별 함수 구현
# (공식) ①,② 두조건을 다 만족해야 윤년임
# ① 년도가 4로 나누어 떨어져야 함
# ② 년도가 100으로나누어 떨어지지 않거나 년도가 400으로 나누어 떨어져야 함
# ex)  4(윤년), 100(평년), 400(윤년)

def is_leap_year(year):
    """
    연도를 입력받아 윤년인지 평년인지 판별하는 함수

    매개변수:
        year (int): 판별할 연도

    반환값:
        bool: 윤년이면 True, 평년이면 False

    윤년 판별 규칙:
        1. 4로 나누어 떨어지면 윤년
        2. 100으로 나누어 떨어지면 평년
        3. 400으로 나누어 떨어지면 윤년

    예시:
        is_leap_year(2020) # True 반환
        is_leap_year(2100) # False 반환
        is_leap_year(2000) # True 반환
    """
    # 직접 구현
    if year%400 ==0:return True
    elif year%100 ==0 : return False
    elif year%4 == 0 : return True
    else: return False

 

제라의 공식으로 요일 판별하기
# 2. 요일 계산 함수 구현
# 제라의 공식을 이용하여 특정 날짜의 요일을 계산합니다.(인터넷 검색하여 요일 구하기)

def get_week(year, month, day) :
    """
    연도, 월, 일을 입력받아 해당 날짜의 요일을 계산하는 함수

    매개변수:
        year (int): 연도
        month (int): 월 (1-12)
        day (int): 일

    반환값:
        int: 요일을 나타내는 정수 (0: 일요일, 1: 월요일, ... 6: 토요일)

    알고리즘:
        제라의 공식을 활용하여 요일 계산

    예시:
        get_week(2024, 1, 1) # 1 반환 (월요일)
        get_week(2024, 1, 7) # 0 반환 (일요일)
    """
    # 직접 구현
    
    if month < 3:
         month +=12
         year -= 1

    year_a=year//100
    year_b=year%100

    return int(((21 * year_a // 4) + (5 * year_b // 4) + (26 * (month + 1) // 10) + day - 1) % 7)

 

간단한 달력 함수 구현
import calendar
# 3. 간단한 달력 출력 함수 구현
# 연도와 월을 입력받아 해당 월의 일수를 나열하는 함수를 구현합니다.
# 윤년, 평년을 고려하여 2월달의 일수도 알맞게 출력해야 합니다. (문제 1의 함수 활용)
def print_simple_calendar(year, month):
    """
    연도와 월을 입력받아 해당 월의 모든 일자를 나열하는 함수

    매개변수:
        year (int): 연도
        month (int): 월 (1-12)

    출력 형식:
        "YYYY년 MM월 - 01일, 02일, 03일, ..., NN일"

    작동 방식:
        1. 해당 월의 일수 결정 (윤년 여부에 따라 2월 일수 조정)
        2. 모든 일자를 나열하여 출력

    예시:
        print_simple_calendar(2024, 1)
        # "2024년 01월 - 01일, 02일, 03일, ..., 31일" 출력
    """
    day =0
    # 직접 구현
    if month==2:
        if is_leap_year(year) : day =29
        else: day = 28 
    else : day = calendar.monthrange(year, month)[1]
    print (f'{year}년 {month}월 - ',end="")

    for i in range(1,day+1):
        if i == day :
            print(f'{i:02d}일',end = '')
        else: print(f'{i:02d}일,',end = '')

print_simple_calendar(2024, 2)
더보기

i:02d -> 두 숫자로 채우되 한자리면 0으로 채움

calendar.monthrange(year, month)[1] ->며치리까지 있는지
[0]은 1일의 요일을 반환

 

달력 출력

 

#4. 달력 형식 출력 함수 구현
# 연도와 월을 입력받아 실제 달력처럼 요일별로 정렬된 형태로 출력합니다.
def print_calendar(year, month):
    """
    연도와 월을 입력받아 달력 형식으로 출력하는 함수

    매개변수:
        year (int): 연도
        month (int): 월 (1-12)

    출력 형식:
        YYYY년 MM월
        Sun Mon Tue Wed Thu Fri Sat
          1   2   3   4   5   6
          7   8   9  10  11  12  13
          ...

    시각화 요소:
        - 일요일: 빨간색으로 표시
        - 토요일: 파란색으로 표시
        - 기타 요일: 기본 색상으로 표시

    작동 방식:
        1. 해당 월의 1일의 요일 계산
        2. 해당 월의 일수 결정
        3. 2차원 리스트에 날짜 배치
        4. 요일에 따라 색상을 적용하여 출력

    예시:
        print_calendar(2024, 1)
        # 2024년 01월 달력 출력
    """
    # 직접 구현
    week = ['Sun','Mon','Tue','Wed','Fri','Sat']
    wee, day = calendar.monthrange(year,month)

    print(f"{year}년 {month:02d}월")
    print(" ".join(week))
    print("    " * wee, end="")

    for i in range(1,day+1):
        if (wee + i - 1) % 7 == 0:  # 일요일 (빨간색)
            print(f"\033[91m{i:2d}\033[0m", end="  ")
        elif (wee + i - 1) % 7 == 6:  # 토요일 (파란색)
            print(f"\033[94m{i:2d}\033[0m", end="  ")
        else:  # 평일 (기본 색상)
            print(f"{i:2d}", end="  ")
        
        # 토요일마다 줄바꿈
        if (wee + i-1) % 7 == 6:
            print()
print_calendar(2024, 1)
더보기

\033[91m{day:2d}\033[0m

빨간색\033[색상코드 하면 색상 바뀜

2d 해야 두글자처럼 너비 같아서 예쁨

'Python' 카테고리의 다른 글

파이썬 strftime, rrul 함수  (0) 2025.03.13
파이썬 정규표현식 : re 함수  (0) 2025.03.11
파이썬 버전 확인하기, 다운로드하기  (0) 2025.03.05
Python with 함수  (0) 2025.02.28