
2025년 1월 1일이 수요일 이다. 2025년 a월 b일은 무슨 요일인지? 요일의 이름은 MON, TUE, WED, THU, FRI, SAT, SUN 이다. 파이썬으로 다양한 코딩을 해보자.
2025년 1월 1일이 수요일일 때, 2025년 월 일의 요일을 계산하려면, 1월 1일부터 월 일까지 총 며칠이 지났는지 알아야 한다. 2025년은 평년이므로 2월은 28일까지 있다.
#1: datetime 모듈 사용
가장 간단하고 정확한 방법입니다. 파이썬의 datetime 모듈을 사용하면 날짜와 요일 계산을 쉽게 할 수 있습니다.
from datetime import date
def get_day_of_week(month, day):
# 2025년은 평년입니다.
# 2025년 1월 1일은 수요일입니다.
try:
target_date = date(2025, month, day)
day_of_week = target_date.weekday() # 월요일은 0, 화요일은 1, ..., 일요일은 6
days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
return days[day_of_week]
except ValueError as e:
return f"유효하지 않은 날짜입니다: {e}"
# 예시
print(f"2025년 1월 1일: {get_day_of_week(1, 1)}")
print(f"2025년 3월 1일: {get_day_of_week(3, 1)}")
print(f"2025년 12월 25일: {get_day_of_week(12, 25)}")
print(f"2025년 4월 31일 : {get+day_of_week(4, 31)}")
2025년 1월 1일 : WED
2025년 3월 1일 : SAT
2025년 12월 25일 : THU
2025년 4월 31일 : 유효하지 않은 날짜입니다 : day is out of range for month
코드 분석
이 코드는 파이썬의 datetime 모듈을 활용하여 날짜와 관련된 계산을 수행합니다.
- from datetime import date: 이 코드는 파이썬의 datetime 모듈에서 date 클래스만 가져옵니다. date 클래스는 년, 월, 일을 다루는 객체를 생성하는 데 사용됩니다.
- def get_day_of_week(month, day):: get_day_of_week라는 함수를 정의하며, 이 함수는 month(월)와 day(일) 두 개의 인자를 받습니다.
- try ... except ValueError: 이 부분은 예외 처리를 위한 구문입니다. 사용자가 13월이나 32일처럼 유효하지 않은 날짜를 입력했을 경우, date() 함수는 ValueError를 발생시킵니다. try 블록 안의 코드를 실행하다가 오류가 발생하면 except 블록으로 이동하여 오류 메시지를 반환함으로써 프로그램이 중단되지 않도록 합니다.
- target_date = date(2025, month, day): date() 클래스를 이용해 2025년 month월 day일의 날짜 객체를 생성합니다. 이 객체에는 해당 날짜의 여러 정보가 담겨 있습니다.
- day_of_week = target_date.weekday(): 생성된 target_date 객체의 weekday() 메서드를 호출합니다. 이 메서드는 해당 날짜가 일주일 중 몇 번째 날인지를 정수(integer)로 반환합니다. 파이썬의 weekday()는 월요일을 0, 화요일을 1, ..., 일요일을 6으로 인덱싱합니다.
- days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']: 요일 이름을 담고 있는 리스트를 정의합니다. weekday()가 반환하는 인덱스와 순서가 일치하도록 월요일부터 일요일까지 나열되어 있습니다.
- return days[day_of_week]: weekday() 메서드가 반환한 요일의 인덱스(day_of_week)를 사용하여 days 리스트에서 해당하는 요일 이름(문자열)을 찾아 반환합니다.
코드의 장점
- 간결성: 파이썬 내장 모듈을 활용하여 복잡한 계산(윤년, 월별 일수 등) 없이도 쉽게 요일을 구할 수 있습니다.
- 정확성: datetime 모듈은 날짜와 시간 계산에 있어 표준 라이브러리이므로 신뢰할 수 있습니다.
- 유지보수 용이성: 만약 2025년이 아닌 다른 해의 요일을 알고 싶을 경우 date(2025, ...) 부분의 연도만 변경하면 됩니다.
#2: 수동 계산 (요일 인덱스 사용)
datetime 모듈을 사용하지 않고 직접 계산하는 방법입니다. 1월 1일부터의 총 일수를 구한 후, 7로 나눈 나머지를 이용해 요일을 찾습니다.
- 1월 1일: 수요일 (인덱스 2)
- 요일 인덱스: 0 (MON), 1 (TUE), 2 (WED), 3 (THU), 4 (FRI), 5 (SAT), 6 (SUN)
def get_day_of_week_manual(month, day):
days_in_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 1월 1일부터 a월 b일까지의 총 일수 계산
total_days = 0
for m in range(1, month):
total_days += days_in_month[m]
total_days += day
# 1월 1일은 수요일이므로, 요일 인덱스는 (총 일수 - 1) % 7 + 시작 요일 인덱스
# 1월 1일: 수요일 (인덱스 2)
start_day_index = 2
# 1월 1일은 1일이므로, (1-1)%7 = 0. total_days가 1이면, total_days-1 = 0
day_of_week_index = (total_days - 1 + start_day_index) % 7
days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
return days[day_of_week_index]
# 예시
print(f"2025년 1월 1일: {get_day_of_week_manual(1, 1)}")
print(f"2025년 3월 1일: {get_day_of_week_manual(3, 1)}")
print(f"2025년 12월 25일: {get_day_of_week_manual(12, 25)}")
코드 분석
- days_in_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
- 월별 일수를 저장하는 리스트입니다.
- 인덱스 0은 사용하지 않으며, 인덱스 1부터 12까지 각각 1월부터 12월의 일수를 나타냅니다. 2025년은 평년이므로 2월은 28일로 설정되었습니다.
- total_days = 0
- 1월 1일부터 계산하려는 날짜까지의 총 일수를 저장할 변수를 초기화합니다.
- for m in range(1, month):
- 입력된 month 이전의 모든 월을 반복합니다. 예를 들어, month가 3(3월)이면 1월과 2월을 반복합니다.
- total_days += days_in_month[m]: 각 월의 일수를 total_days에 누적해서 더합니다.
- total_days += day: 반복문이 끝난 후, 계산하려는 day의 일수를 total_days에 더해 총 일수를 완성합니다.
- start_day_index = 2
- 요일의 시작 기준이 되는 1월 1일이 수요일이므로, 수요일의 인덱스(2)를 저장합니다.
- 이 코드에서는 요일을 ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'] 순서로 정의했으므로, 월요일이 0, 화요일이 1, 수요일이 2입니다.
- day_of_week_index = (total_days - 1 + start_day_index) % 7
- 이 부분이 핵심 계산 로직입니다.
- total_days - 1: 1월 1일은 1일째이지만, 요일을 계산할 때 기준일(1월 1일)로부터 며칠이 지났는지를 계산하기 위해 1을 뺍니다. 1월 1일의 경우 1 - 1 = 0이 되어 0일이 지난 것으로 계산됩니다.
- + start_day_index: 기준일로부터 지난 일수에 시작 요일 인덱스를 더해줍니다. 1월 1일의 경우 0 + 2 = 2가 되어 수요일 인덱스를 갖게 됩니다.
- % 7: 7로 나눈 나머지를 구합니다. 이는 요일이 7일마다 반복되는 특성을 이용한 것으로, 결과 값은 0부터 6까지의 정수가 됩니다. 이 정수가 최종 요일 인덱스가 됩니다.
- days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
- 요일 이름을 문자열로 담은 리스트입니다. day_of_week_index를 이용해 요일 이름을 찾을 때 사용됩니다.
- return days[day_of_week_index]
- 계산된 요일 인덱스에 해당하는 요일 이름을 리스트에서 찾아 반환합니다.
코드의 장점 및 한계
- 장점: 파이썬 표준 라이브러리를 사용하지 않고, 수학적인 원리만으로 요일을 계산하는 방법을 보여줍니다. 이는 알고리즘 이해에 도움이 됩니다.
- 한계: 윤년을 고려하지 않았기 때문에, 2024년이나 2028년 같은 윤년의 날짜를 계산할 때는 days_in_month[2] 값을 29로 수동으로 변경해주어야 합니다. 또한, 유효하지 않은 날짜(예: 2월 30일)에 대한 예외 처리가 없어 오류가 발생할 수 있습니다.
#3: 수동 계산 (딕셔너리 및 누적합 사용)
두 번째 방법과 유사하지만, 딕셔너리를 사용하여 코드의 가독성을 높입니다.
def get_day_of_week_dict(month, day):
# 2025년은 평년 (2월 28일)
days_in_month = {
1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30,
7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31
}
total_days = 0
for m in range(1, month):
total_days += days_in_month[m]
total_days += day
# 1월 1일 (수요일)을 기준으로 요일 계산
# 1월 1일은 1일째이며, 수요일입니다.
# 요일 순서: MON, TUE, WED, THU, FRI, SAT, SUN
# 인덱스: 0, 1, 2, 3, 4, 5, 6
# (총 일수 - 1) % 7
# 1월 1일: (1-1) % 7 = 0
# 1월 2일: (2-1) % 7 = 1
# 요일은 수요일(인덱스 2)부터 시작하므로
day_index = (total_days - 1 + 2) % 7
day_names = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
return day_names[day_index]
# 예시
print(f"2025년 1월 1일: {get_day_of_week_dict(1, 1)}")
print(f"2025년 3월 1일: {get_day_of_week_dict(3, 1)}")
print(f"2025년 12월 25일: {get_day_of_week_dict(12, 25)}")
제공된 파이썬 함수 get_day_of_week_dict는 딕셔너리(Dictionary)와 수동 계산을 사용하여 2025년의 특정 날짜에 대한 요일을 찾는 코드입니다. 이 코드는 datetime 모듈을 사용하지 않고, 1월 1일부터 해당 날짜까지의 총 일수를 계산한 뒤, 7일 주기를 이용해 요일을 알아내는 원리를 따릅니다.
코드 분석
1. 월별 일수 정의
days_in_month 딕셔너리는 각 월의 날짜 수를 저장합니다. 2025년은 평년이므로 2월의 일수는 28일로 설정되었습니다. 딕셔너리를 사용함으로써 월별 일수에 접근하는 코드가 더 직관적이고 읽기 쉬워집니다.
days_in_month = {
1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30,
7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31
}
2. 총 일수 계산
total_days 변수는 1월 1일부터 입력된 날짜까지의 총 일수를 계산합니다.
- for 루프: range(1, month)를 통해 입력된 월(month)의 이전 월들(예: 3월이면 1월과 2월)을 순회하며 days_in_month 딕셔너리에서 해당 월의 일수를 찾아 total_days에 더합니다.
- 마지막 날짜 추가: 루프가 끝난 후, 입력된 day 값을 total_days에 더하여 최종적인 총 일수를 구합니다.
3. 요일 인덱스 계산
이 부분이 핵심 로직입니다. 요일은 7일마다 반복되므로, 총 일수를 7로 나눈 나머지를 이용해 요일 인덱스를 계산합니다.
- total_days - 1: 날짜는 1부터 시작하지만, 계산은 0부터 시작하는 경과 일수 개념으로 합니다. 예를 들어, 1월 1일은 첫째 날이지만, 경과 일수는 0일입니다.
- + 2: 2025년 1월 1일은 수요일입니다. 코드에서는 요일을 ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'] 순서로 정의했으므로, 수요일은 인덱스 2에 해당합니다. 이 값을 더해 시작 요일의 위치를 보정합니다.
- % 7: 7로 나눈 나머지(modulo) 연산을 통해 최종적인 요일 인덱스를 구합니다. 이 값은 항상 0에서 6 사이입니다.
4. 요일 이름 반환
day_names 리스트에서 계산된 day_index에 해당하는 요일 이름(문자열)을 찾아 반환합니다

'파이썬(문제풀이)' 카테고리의 다른 글
| 파이썬 대소문자 바꿔서 출력하기 (0) | 2025.09.11 |
|---|---|
| 파이썬 10진수를 이진수로 (0) | 2025.09.11 |
| 파이썬 숫자가 주어지면 소수인지 아닌지 판별 (0) | 2025.09.10 |
| 파이썬 구구단 출력 (0) | 2025.09.09 |
| 파이썬 1에서 100가지 더하기 (0) | 2025.09.09 |