[SWEA]1948. 날짜 계산기
1948.날짜 계산기
문제
월 일로 이루어진 날짜를 2개 입력받아, 두 번째 날짜가 첫 번째 날짜의 며칠째인지 출력하는 프로그램을 작성하세요.
제약 사항
실제 날짜를 기반으로 값이 주어지고 두 번째 날짜가 첫 번째 날짜보다 항상 크게 주어집니다.
각 달의 마지막 날짜는 1/31, 2/28, 3/31, 4/30, 5/31, 6/30, 7/31, 8/31, 9/30, 10/31, 11/30, 12/31입니다.
주어지는 수는 4개가 주어지는데, 첫 번째 수가 월 두 번째 수가 일입니다.
생각해보기
우선 datetime 모듈이 생각납니다. datetime 모듈에는 date, time, datetime, timedelta 등 여러 클래스가 있습니다.
그 중에 timedelta
는 어떠한 시간을 기준으로 그 차이를 더하거나 빼서 그 이후 날짜를 아는 것이기 때문에 맞지 않습니다.
그러면 31일을 가진 달과 아닌 달을 구분해서 리스트를 만들고 계산하면 어떨지 싶습니다.
조건문으로 만약 달이 31일 달이라면 31 빼기 주어진 일 하고 그다음 수의 일을 더하면 일이 나올 것 같습니다.
풀어보기
T = int(input())
for tc in range(1, 1+T):
# date = input().split()
date = list(map(int,input().split()))
A = date[:2]
B = date[2:]
last = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31,
6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
count = 0
rest = 0
if B[0] > A[0]:
for i in range(A[0]+1, B[0]):
count += last[i]
rest = last[A[0]]-A[1] + 1+ count + B[1]
else:
rest = B[1] - A[1] + 1
print(f'#{tc}',rest)
처음에는 달을 분리해서 31일인 달, 30일인 달, 28일인 달을 분리해서 목록화하고 if 조건문으로 주어진 달이 다를 때 첫 번째 달이 어떤 리스트에 속할 때 그 리스트가 향하는 값에서 일을 빼려고 했는데, 생각해 보니까 달과 달 사이의 차는 1달만 있는 것이 아니라 여러 달이 존재할 수 있다는 것을 깨달았습니다.
그래서 아예 dictionary로 만들어서 마지막 날짜를 출력하도록 키와 값을 정하고 주어진 두 개의 달 사이 달은 각각의 값을 누적 합해서 따로 만들어 주고 첫 번째 주어진 달을 dict에 넣어 마지막 달을 출력해 첫 번째 일을 빼고 1을 더해줬습니다.
그 값과 누적합 그리고 두 번째 주어진 값의 일을 더하면 며칠째인지 출력됩니다.
두 날짜가 같은 달이라면 따로 누적합을 0으로 설정해서 출력하도록 했습니다.
댓글남기기