"YYYY-MM-DD" 형식의 날짜 문자열이 주어졌을 때, 해당 날짜가 그 해의 몇 번째 날인지 반환하는 문제입니다. 예를 들어 날짜가 "2019-02-10"이라면, 이는 2019년의 41번째 날에 해당합니다.
문제 해결 접근 방법
이 문제는 다음과 같은 단계로 해결할 수 있습니다.
- 각 월의 일수를 담은 배열 D를 준비합니다. 예: [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
- 입력된 날짜 문자열을 하이픈(-) 기준으로 분리하여 연도, 월, 일로 변환합니다.
- 해당 연도가 윤년이라면 2월의 일수(D[2])를 29로 늘립니다.
- 목표 월 직전까지의 누적 일수에 일(day) 값을 더하여 최종 결과를 계산합니다.
윤년 판별 조건
윤년 여부는 다음 규칙으로 판단합니다.
- 연도가 400으로 나누어 떨어지면 윤년입니다.
- 연도가 4로 나누어 떨어지지만 100으로는 나누어 떨어지지 않으면 윤년입니다.
구현 예제
다음 코드를 통해 실제 구현 과정을 살펴보겠습니다.
class Solution(object):
def dayOfYear(self, date):
days = [0,31,28,31,30,31,30,31,31,30,31,30,31]
d = list(map(int,date.split("-")))
if d[0] % 400 == 0:
days[2]+=1
elif d[0]%4 == 0 and d[0]%100!=0:
days[2]+=1
for i in range(1,len(days)):
days[i]+=days[i-1]
return days[d[1]-1]+d[2]
ob1 = Solution()
print(ob1.dayOfYear("2019-02-10"))
코드 동작 원리
- 일수 배열 초기화: 인덱스 0은 사용하지 않으며, 각 인덱스가 해당 월의 일수를 나타냅니다.
- 날짜 파싱:
split("-")으로 문자열을 나눈 후map(int, ...)을 통해 정수 리스트로 변환합니다. - 윤년 처리: 윤년이라면 2월 일수를 28에서 29로 증가시킵니다.
- 누적 합 계산: 반복문을 통해 배열을 누적합 형태로 바꾸면, days[m]은 1월부터 m월 말까지의 총 일수가 됩니다.
- 결과 반환: 목표 월의 직전 월까지 누적 일수(days[d[1]-1])에 일(d[2])을 더하면 해당 날짜가 연중 몇 번째 날인지 구할 수 있습니다.
입력
"2019-02-10"
출력
41
2019년은 평년이므로 1월의 31일에 2월 10일을 더한 41이 정답으로 출력됩니다. 만약 입력이 "2020-02-10"이었다면 2020년은 윤년이기 때문에 결과는 42가 됩니다.