문제 출처:https://leetcode.com/problems/day-of-the-year/
문제 분석
1900년 1월 1일부터 2019년 12월 31일까지 중 input으로 주어진 날짜가 그 해의 몇번째 되는 날인지를 출력하면 되는 문제입니다. 각 달은 1월부터 12월까지 31,28,31,30,31,30,31,31,30,31,30,31를 반복한다는 규칙을 가지고 있습니다. 총합은 365일이죠.
하지만 지구가 태양에 대해 한 번 회전하는 데 필요한 시간의 길이는 실제로 365.2425일이므로 4년에 한 번씩 366일의 "윤년"을 사용함으로써 (짧은) 평년 3년으로 인한 오류를 제거합니다. 4로 균등하게 나눌 수 있는 연도는 윤년입니다. 예를 들어 1988년, 1992년, 1996년은 윤년입니다. 그러나 고려해야 할 작은 오류가 아직 남아 있습니다. 이 오류를 없애기 위해 양력은 100으로 균등하게 나눌 수 있는 연도(예: 1900)가 400으로도 균등하게 나눌 수 있는 경우에만 윤년이라고 규정합니다.
출처:https://docs.microsoft.com/ko-kr/office/troubleshoot/excel/determine-a-leap-year
때문에 윤년임을 판단하기 위해서는 다음 단계를 따릅니다:
- 연도를 4으로 균등하게 나눌 수 있는 경우 2단계로 이동합니다.
- 그렇지 않으면 5단계로 이동하세요.연도를 100으로 균등하게 나눌 수 있는 경우 3단계로 이동합니다.
- 그렇지 않으면 4단계로 이동하세요.연도를 400으로 균등하게 나눌 수 있는 경우 4단계로 이동합니다.
- 그렇지 않으면 5단계로 이동하세요.해당 연도는 윤년(366일)입니다.
- 해당 연도는 윤년이 아닙니다(365일).
이러한 부분만 조심해서 문제를 접근하면 쉽게 풀 수 있습니다. 코드는 다음과 같습니다:
class Solution {
public:
int dayOfYear(string date) {
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int y = stoi(date.substr(0, 4)), m = stoi(date.substr(5, 2)), d = stoi(date.substr(8, 2));
if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))
days[1] = 29;
for(int i=0 ; i < m-1 ; i++)
d += days[i];
return d;
}
};
해당 문제는 Github에서도 보실 수 있습니다:
https://github.com/gurcks8989/CodingTest/blob/master/LeetCode/P1154_Day_of_the_Year.cpp
훈수 및 조언은 언제든 환영입니다.