본문 바로가기
알고리즘 문제 & 프로그래밍/C++

[C++]프로젝트 오일러 19번 문제&풀이 (20세기에서, 매월 1일이 일요일인 경우는 몇 번?)

by 달슬 2020. 12. 3.
반응형

문제 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

 

mannlim/ProjectEuler

How to solve Project Euler using by C++. Contribute to mannlim/ProjectEuler development by creating an account on GitHub.

github.com

 

반응형

댓글