파이썬 프로그램을 이용하여 윤년을 찾는 코드를 수학의 집합 개념을 사용하여 간단히 작성하는 방법을 알아보고 날짜와 시간을 사용하는 방법을 알아보겠습니다.
날짜와 시간 그리고 윤년 찾기
날짜 다루기
calendar 모듈은 달력과 관련된 기능을 수행합니다. 예를 들어서 원하는 달의 달력을 출력할 수 있습니다.
import calendar
print(calendar.month(2024, 2))
February 2024
Mo Tu We Th Fr Sa Su
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
import calendar
for week in calendar.Calendar().monthdatescalendar(2024, 2):
print(week)
[datetime.date(2024, 1, 29), datetime.date(2024, 1, 30), datetime.date(2024, 1, 31), datetime.date(2024, 2, 1), datetime.date(2024, 2, 2), datetime.date(2024, 2, 3), datetime.date(2024, 2, 4)]
[datetime.date(2024, 2, 5), datetime.date(2024, 2, 6), datetime.date(2024, 2, 7), datetime.date(2024, 2, 8), datetime.date(2024, 2, 9), datetime.date(2024, 2, 10), datetime.date(2024, 2, 11)]
[datetime.date(2024, 2, 12), datetime.date(2024, 2, 13), datetime.date(2024, 2, 14), datetime.date(2024, 2, 15), datetime.date(2024, 2, 16), datetime.date(2024, 2, 17), datetime.date(2024, 2, 18)]
[datetime.date(2024, 2, 19), datetime.date(2024, 2, 20), datetime.date(2024, 2, 21), datetime.date(2024, 2, 22), datetime.date(2024, 2, 23), datetime.date(2024, 2, 24), datetime.date(2024, 2, 25)]
[datetime.date(2024, 2, 26), datetime.date(2024, 2, 27), datetime.date(2024, 2, 28), datetime.date(2024, 2, 29), datetime.date(2024, 3, 1), datetime.date(2024, 3, 2), datetime.date(2024, 3, 3)]
날짜와 시간을 다룰 때는 datetime 모듈을 사용합니다. 예를 들어서 아래와 같이 현재 날짜와 시간을 알 수 있습니다.
import datetime
# 현재 날짜와 시간을 출력하고 싶을 경우
print(datetime.datetime.now())
# 날짜와 시간을 따로따로 다룰 수도 있어요
year = datetime.date.today().year
month = datetime.date.today().month
day = datetime.date.today().day
hour = datetime.datetime.now().hour
minute = datetime.datetime.now().minute
second = datetime.datetime.now().second
print(year, month, day, hour, minute, second)
2022-08-04 15:38:42.042800
2022 8 4 15 38 42
날짜 간의 더하기 빼기도 할 수 있습니다.
import datetime
datetime.date(2022, 8, 4) + datetime.timedelta(days = 10)
datetime.date(2022, 8, 14)
import datetime
datetime.date(2022, 10, 15) - datetime.date.today()
datetime.timedelta(days=72)
시간 재기
파이썬에서 시간을 측정할 때 사용할 수 있는 가장 간단한 방법은 time 모듈을 사용하는 것입니다. time.time()
을 이용하면 현재 시간이 1970년 1월 1일 00:00:00 (UTC)로부터 몇 초가 지났는 지를 알려줍니다.
아래와 같이 프로그램 안에서 시간이 얼마나 지났는지 시간의 간격을 초 단위로 측정할 때 많이 사용합니다.
import time
start_time = time.time()
# 얼마나 걸리는지 시간을 재고 싶은 일을 여기서 합니다.
time.sleep(1.5) # 1.5초 동안 아무것도 하지 않고 쉽니다.
end_time = time.time()
elapsed_time = end_time - start_time
print(elapsed_time) # 시간이 얼마나 지났는지 출력
1.5090909004211426
물론 datetime으로도 시간을 잴 수 있습니다.
import time # sleep()을 사용하기 위해서
import datetime
start_time = datetime.datetime.now()
# 얼마나 걸리는지 시간을 재고 싶은 일을 여기서 합니다.
time.sleep(1.5) # 1.5초 동안 아무것도 하지 않고 쉽니다.
end_time = datetime.datetime.now()
print(type(end_time))
elapsed_time = end_time - start_time
print(type(elapsed_time))
print(elapsed_time.total_seconds()) # time과 사용 방법이 약간 다릅니다.
<class 'datetime.datetime'>
<class 'datetime.timedelta'>
1.501391
시간 단위 변환
80초를 분과 초로 바꾸기.
input_seconds = 80
minutes = input_seconds // 60
seconds = input_seconds % 60
print(f"{input_seconds}초는 {minutes}분 {seconds}초 입니다.")
80초는 1분 20초 입니다.
divmod()
함수를 이용하기.
input_seconds = 80
minutes, seconds = divmod(input_seconds, 60)
print(f"{input_seconds}초는 {minutes}분 {seconds}초 입니다.")
80초는 1분 20초 입니다.
시간에 대해 while문 사용하기
while
루프를 사용해서 총 5초 동안 1초에 한 번 씩 현재 시간을 출력하는 프로그램을 작성해봅시다.
import time
import datetime
start_time = time.time() # 시작 조건
while time.time() - start_time <= 5:
print(datetime.datetime.now())
time.sleep(1)
2022-08-04 15:38:45.247711
2022-08-04 15:38:46.259295
2022-08-04 15:38:47.261238
2022-08-04 15:38:48.265529
2022-08-04 15:38:49.270934
윤년 확인
calendar 모듈의 isleap()을 이용해서 어떤 해가 윤년인지 아닌지 판단할 수 있습니다. 예를 들어서 2022년은 윤년이 아니고 2024년은 윤년입니다.
import calendar
calendar.isleap(2022), calendar.isleap(2024)
(False, True)
위키디피아의 윤년 판별 순서도에 의한 윤년 판별
import calendar
leap_year_list = []
for year in range(2022, 2201):
is_leap = None
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
is_leap = True
leap_year_list.append(year)
else:
is_leap = False
else:
is_leap = True
leap_year_list.append(year)
else:
is_leap = False
if calendar.isleap(year) != is_leap:
print("에러", year)
break
else:
print("테스트 통과")
print(leap_year_list)
테스트 통과
[2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196]
집합의 개념을 사용하여 문제 풀기 자연수 n에 대하여
A = set(n % 4 == 0)
B = set(n % 100 == 0)
C = set(n % 400 == 0)
이라 두면 집합 C는 집합 B의 부분집합이고, 집합 B는 집합 C의 부분집합이므로 윤년이 되기 위한 조건을 집합으로 표현하면
A 교집합 (B 여집합) 또는 집합 C 이면 됨. 그런데 집합 C는 A 교집합 C 이므로 [A 교집합 (B 여집합) 또는 집합 C]
는 A 교집합 ((B 여집합) 합집합 C)
import calendar
for year in range(2022, 2222):
is_leap = year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
if calendar.isleap(year) != is_leap:
print("에러", year)
break
else:
print("테스트 통과")
테스트 통과
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받을 수 있습니다.
'수학과 코딩' 카테고리의 다른 글
파이썬 랜덤(random) 사용법 정리(randrange, randint, random.choice 등) (0) | 2022.08.06 |
---|---|
python 난수(random, range, int, choice)등 정리 및 문제 (0) | 2022.08.06 |
Python 평균(Mean), 회문(Palindrome)검사, 플로이드 삼각형 (0) | 2022.08.04 |
Python Mean, Palindrome, Item change, Floyd Triangle(평균, 회문, 아이템변경, 플로이드 삼각형) (0) | 2022.08.02 |
python multiplication table, greatest common divisor (0) | 2022.08.02 |
댓글