반응형
문제 19번
다음은 달력에 관한 몇 가지 일반적인 정보입니다 (필요한 경우 좀 더 연구를 해 보셔도 좋습니다).
- 1900년 1월 1일은 월요일이다.
- 4월, 6월, 9월, 11월은 30일까지 있고, 1월, 3월, 5월, 7월, 8월, 10월, 12월은 31일까지 있다.
- 2월은 28일이지만, 윤년에는 29일까지 있다.
- 윤년은 연도를 4로 나누어 떨어지는 해를 말한다. 하지만 400으로 나누어 떨어지지 않는 매 100년째는 윤년이 아니며, 400으로 나누어 떨어지면 윤년이다
20세기 (1901년 1월 1일 ~ 2000년 12월 31일) 에서, 매월 1일이 일요일인 경우는 총 몇 번입니까?
접근방법
1. 매월 1일 & 일요일을 판명해야 하므로, (연 X 월)로 이루어진 2차원 배열을 만든다.
2. 1900년 1월 1일이 월요일이므로, 이 정보를 활용하기 위해 (101 X 12) 배열을 만든다.
(1900년 ~ 2000년 각 월의 일 수를 배열에 담는다.)
3. 문제에서 요구하는 것은 20세기 (1901년 1월 1일 ~ 2000년 12월 31일) 에서의 매월 1일 & 일요일이므로, 1900년의 일 수 합계를 sum에 저장한다. (1900년은 윤년이 아니므로 365가 담긴다.)
4. 그럼 이제 배열의 각 요소를 sum과 더할 때마다 sum+1은 항상 매월 1일까지의 누적 일 수 합이 되므로, 이 값이 7로 나누었을 때 0이 되는 값을 세면 된다(count)
#include <iostream>
using namespace std;
int check_feb(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 29;
else
return 28;
}
int main()
{
int day_array[101][12];
for (int year = 0; year < 101; year++)
{
for (int mon = 0; mon < 12; mon++)
{
if (mon == 3 || mon == 5 || mon == 8 || mon == 10)
{
day_array[year][mon] = 30;
}
if (mon == 0 || mon == 2 || mon == 4 || mon == 6 || mon == 7 || mon == 9 || mon == 11)
{
day_array[year][mon] = 31;
}
if (mon == 1)
{
day_array[year][mon] = check_feb(1900 + year);
}
//cout << day_array[year][mon] << "\t";
}
//cout << endl;
}
//cout << endl;
int sum = 0;
int count = 0;
for (int mon = 0; mon < 12; mon++)
{
sum += day_array[0][mon];
}
for (int year = 1; year < 101; year++)
{
for (int mon = 0; mon < 12; mon++)
{
if ((sum + 1) % 7 == 0)
{
count += 1;
}
sum += day_array[year][mon];
}
}
cout << "Answer is : " << count << endl;
return 0;
}
참고
https://github.com/mannlim/ProjectEuler
반응형
'알고리즘 문제 & 프로그래밍 > C++' 카테고리의 다른 글
[C++]프로젝트 오일러 21번 문제&풀이 (10000 이하 모든 친화수(우애수)의 합은?) (0) | 2020.12.05 |
---|---|
[C++]프로젝트 오일러 20번 문제&풀이 (100! 의 자릿수를 모두 더하면?) (0) | 2020.12.04 |
[C++]프로젝트 오일러 18번 문제&풀이 (삼각형을 따라 내려가면서 합이 최대가 되는 경로 찾기) (0) | 2020.12.02 |
[C++]프로젝트 오일러 17번 문제&풀이 (1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는?) (0) | 2020.11.26 |
[C++]프로젝트 오일러 16번 문제&풀이 (2의 1000승의 각 자릿수를 모두 더하면?) (0) | 2020.11.25 |
댓글