알고리즘 - 날짜 구하기

KDG·2021년 5월 13일
0

날짜 구하기

문제

우리 천일 후에 만나자!
사랑했던 그녀가 그렇게 말하고 던전 속으로 사라져 버렸다. 홀로 남은 나는 생각했다. 어디 보자, 천일 후면 날짜가...

  • 문제의 정의
    년, 월, 일이 주어졌을 때, n일 이후의 날짜를 계산하라!

  • 문제의 분석

    • 1달은 28일, 29일(윤년), 30일, 31일 중의 하나다.
    • [1,3,5,7,8,10,12월]은 31일, [4,6,9,11월]은 30일, 2월은 28일 또는 29일(윤년)
    • 1년은 365일이기도 하고 366일이기도 하다.(윤년)
    • 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
    • 즉, 날짜를 받아 날짜가 해당 월의 마지막 날을 넘었는 지 확인하고, 윤년인지 확인하고, n일 이후의 날짜를 계산한다.

윤년 확인 함수

def leapyear(y):
    if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0:   # 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때
        return True
    
    else:
        return False

해당 월의 날짜 확인 함수

def invalidDay(y, m, d):    # 해당 월의 마지막 날을 넘겼는지 확인
    days = 31    # 마지막 날이 31일 까지인 월이 가장 많다.
    
    if m in [4, 6, 9, 11]:   # 마지막 날이 30인 월
        days = 30
        
    if m == 2:               # 2월인지 확인
        if leapyear(y):      # 윤년 확인
            days = 29
        else:
            days = 28
            
    if d > days:             # 받은 날이 해당 월의 마지막 날보다 큰 지 확인
        return True
    else:
        return False

n일 후의 날짜 구하기

# n일 후의 날짜 구하기
year = 2021
month = 5
day = 13
n = 1000

for _ in range(n):
    day += 1       # n일 후의 날 까지 하루씩 추가   
    
    if invalidDay(year, month, day):   # 하루씩 추가 된 날이 해당 월의 마지막 날을 넘었는지 확인
        day = 1                        # 추가된 날짜가 해당 월의 마지막 날을 넘으면 일을 1일로 변경하고 월 추가
        month += 1         
        
        if month > 12:     # 월이 12월을 넘으면 다시 1월로 변경하고 년도를 추가
            month = 1
            year += 1
            
print(year, month, day)

** datetime 패키지를 사용하면 훨씬 간단하게 n일 후의 날짜를 구할 수 있다.

import datetime

year = 2021
month = 5
day = 13
n = 1000

day = datetime.date(year, month, day)
theday = day + datetime.timedelta(n)

print(theday)






** 출처
  • 주니온TV 아무거나연구소 - 코린아, 코딩하자 (with 파이썬)

2개의 댓글

comment-user-thumbnail
2021년 5월 13일

이번 포스트는.. 그닥... 내맘속으로 다그닥다그닥♬

1개의 답글