파이썬 실습창을 열 수 있습니다.실습창 열기

1. 요일 구하기
2025년 5월 5일은 월요일입니다.
연, 월, 일을 입력받아서 요일을 구하여 봅시다.

1-1 지나간 날짜 구하기
1년 1월 1일부터 오늘까지 날짜 수를 구하면 요일은 7일씩 반복되므로 오늘의 요일을 구할 수 있을 것 같습니다.

● 오늘까지 날짜 수
1년 1월 1일부터 오늘까지 날짜 수는
- 1년 1월 1일부터 지난 해 12월 31까지의 날짜 수를 구하고(a),
- 올해의 1월 1일부터 지난 달 마지막 날까지 날짜 수를 구하여(b),
- 오늘의 날짜를(c) 모두 더하면 됩니다.
- 즉, ( 1년 1월 1일부터 오늘까지 날짜 수) = a + b + c 입니다.
● a, b, c 구하기
오늘이 y년 m월 d일이면
- a 구하기
올해가 y년이면 1년부터 지난 해까지는 (y-1)년입니다.
(y-1)년 동안의 날짜 수를 구하여 봅시다.
'일단, 1년은 365일로 생각합니다. 그리고 4년마다 윤년이 있었다고 가정하고 윤년의 수만큼 날짜를 더합니다. 너무 많이 더했습니다. 100년에 한 번씩은 윤년을 평년으로 하였으므로 그 숫자만큼 뺍니다. 너무 많이 뺐습니다. 400년에 한 번씩은 평년을 윤년으로 하였으므로 그 수만큼 더해야 합니다.
식으로 정리하면 다음과 같습니다.
(1년부터 지난해 말까지의 날짜 수) = (y-1)*365+(y-1)//4-(y-1)//100+(y-1)//400
(y-1)이 많이 사용되므로 (y-1)을 t라 두고 식을 정리하면,
t = y-1
a = t*365 + t//4 - t//100 + t//400
- b 구하기
올해가 시작되어 지난 달 마지막 날까지의 날짜수를 구하여 봅시다.
즉, y년 1월 1일 부터 y년 (m-1)월 마지막 날까지의 날짜수를 구합니다.
이 계산을 하려면 각 달의 날짜 수를 알아야 하고, 2월이 며칠인가 알아야 합니다.
2월의 날짜수는 올해(y년)가 윤년이며 29일, 평년이면 28일입니다.
다음과 같이 코딩할 수 있습니다.
month=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 각 달의 날짜 수
month[1]+=(y%4==0 and y%100!=0) or (y%400==0) # 윤년이면 28에 1을 더하고, 아니면 0을 더함
b=sum(month[:m-1]) # 지난 달 마지막 날까지이므로 (m-1)
- c 구하기
c는 이번 달 시작하고 며칠째인가이므로 d와 같습니다.
● 정리하면
( 1년 1월 1일부터 오늘까지 날짜 수) =a+b+d 입니다.
다음과 같이 코딩할 수 있습니다.
1년 1월 1일부터 오늘까지 날짜 수가 하루도 틀리지 않습니다.
month=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 각 달의 날짜 수
y,m,d=2025, 5, 5
month[1]+=(y%4==0 and y%100!=0) or (y%400==0)
t = y-1
days=(t*365 + t//4 - t//100 + t//400)+sum(month[:m-1])+d
print(days)
1-2 요일 구하기
1년 1월 1일은 무슨 요일일까요?
그레고리 교황은 월요일로 정했습니다.
(아마도 일요일까지 쉬고 월요일 부터 세상을 돌리기 시작했나 봅니다.)
1년 1월 1일부터의 날짜와 요일입니다.
1년 1월 1일 |
2일 |
3일 |
4일 |
5일 |
6일 |
7일 |
8일 |
9일 |
10일 |
월 | 화 | 수 | 목 | 금 | 토 | 일 | 월 | 화 | 수 |
날짜 수를 7로 나눈 나머지가 0이면 일요일, 1이면 월요일, ..., 6이면 토요일입니다.
코딩하면, week=days%7 이 됩니다.
2. 완성하기
완성된 프로그램은 다음과 같습니다.
name=['일','월', '화','수','목', '금','토']
month=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 각 달의 날짜 수
y,m,d=2025,5,5
month[1]+=(y%4==0 and y%100!=0) or (y%400==0)
t = y-1
days=(t*365 + t//4 - t//100 + t//400)+sum(month[:m-1])+d
week=days%7
w=f'{y}년 {m}월 {d}일은 {name[week]}요일 입니다.'
print(w)
'''
8번 줄의 f-format이 실행되지 않으면 다음의 고급 포맷을 사용하세요.
w='{}년 {}월 {}일은 {}요일 입니다.' .format(y,m,d,name[week])
조금 더 간단히 할 수도 있습니다.
6번 줄의 t*365를 봅시다.
t*365
= t*(7*52+1)
= t*7*52 + t
요일은 7로 나눈 나머지를 이용하므로 7의 배수 부분은 제거하여도 됩니다.
즉, t*365를 t만 사용하여도 됩니다.
days=(t + t//4 - t//100 + t//400)+sum(month[:m-1])+d
결과는 같습니다.
'''
※ [참고] 생존일수 구하기
나는 태어나서 지금까지 며칠 살았을까?
이 질문에 대답하여 봅시다.

나의 생존일수는,
1년 1월 1일부터 오늘까지의 날짜 수에서
1년 1월 1일부터 생일까지의 날짜 수를 빼면됩니다.
코딩으로 확인하세요.
month=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def days(y,m,d): # 함수, 반복 사용하는 경우 편리하다
month[1]+=(y%4==0 and y%100!=0) or (y%400==0)
t = y-1
days=(t*365 + t//4 - t//100 + t//400)+sum(month[:m-1])+d
return days
y,m,d=2024,4,9 # 오늘 날짜
by,bm,bd=2005,5,5 # 생일 날짜
lifeday=days(y,m,d)-days(by,bm,bd) # 생존 일수
print(lifeday)
'''
함수를 사용하였습니다.
실행되면 8번 줄부터 시작합니다.
10번 줄에서 y,m,d가 2번 줄의 y,m,d에 전달되고,
계산 결과는 6번 줄의 return에서 10번 줄로 반환됩니다.
다음에는 10번 줄의 by,bm,bd가 2번 줄의 y,m,d에 전달되어 계산결과가 반환됩니다.
반환된다는 것은 값을 호출한 곳으로 되돌여 보낸다는 것입니다.
태어나서 지금까지 잠을 잔 시간? lifeday*8
태어나서 지금까지 밥값? lifeday*3*5000 (한끼 식사비 5000원)
그이를 만난지 며칠? 생일 대신 처음 만난 날짜 입력
이자를 얼마 받을까? 빌려준 날짜, 오늘 입력 그리고 계산
'''
현재 우리가 사용하고 있는 그레고리력은 1582년부터 3000년까지 사용할 수 있습니다.
3000년이 되면 하루를 수정하여야합니다.
그때까지 살아서 하루를 다 함께 수정합시다.
수고하셨습니다.
오늘 끝.
'알고리듬' 카테고리의 다른 글
[알고리듬] #46 while문의 이해 (0) | 2024.04.11 |
---|---|
[알고리듬] #46 삼각형 판별 (0) | 2024.04.10 |
[알고리듬] #44 윤년과 평년(2) (0) | 2024.04.08 |
[알고리듬] #43 윤년과 평년(1) (2) | 2024.04.07 |
[알고리듬] #42 조건 연산(if) (0) | 2024.04.07 |