Script / CSS

G1sUtil.js

G1sBlogger.js

G1sNavigationList.js

G1sCode

G1sTagList

Posts List

2012년 3월 3일 토요일

[Euler Project] 19. 20세기에서, 매월 1일이 일요일인 경우는 몇 번?

19. 20세기에서, 매월 1일이 일요일인 경우는 몇 번?
다음은 달력에 관한 몇 가지 일반적인 정보입니다 (필요한 경우 좀 더 연구를 해 보셔도 좋습니다).
  • 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일이 일요일인 경우는 총 몇 번입니까?

Click

외부클레스로 하신분들이 많은 듯... 그렇게 하면 간단하게 구현 할 수는 있으나 문제의 취지와는 안 맞는 듯 하여 직접 count.
<script>
/* 윤년 판단. */
function isLeap(y){
    return !(y%4!=0||(y%100==0&&y%400!=0));
}
/* 시작년도 부터 종료 년도까지의 각 달이 일요일로 시작하는 경우. */
function p019(sy,sm,ey,em){
    //초기 날짜 설정.
    var y = 1900;
    var m = 1;
    var w = 1;
    var d = 1;

    //count
    var cnt = 0;
    
    //count 시작 년도로 이동.
    var dy = sy - y;    
    d += dy*365 + parseInt(dy/4) - parseInt((dy+300)/400);
    
    //count 시작월로 이동.
    for(;m< sm; m++){
        if(m==2)           //2월 28 or 29
            d += (isLeap(sy))?29:28;
        else if((m%2==0&&m<8)||(m%2==1&&m>8))   //30
            d += 30;
        else                //31
            d += 31;
    }
        
    //count 시작.
    for(y=sy;y<=ey;y++){
       for(;m<=12;m++){
           if(m==2)           //2월 28 or 29
               d += (isLeap(y))?29:28;
           else if((m%2==0&&m<8)||(m%2==1&&m>8))   //30
               d += 30;
           else                //31
               d += 31;
            
           if((d+w)%7 == 0)        //요일확인.
               cnt ++;
           
           if(y==ey && m==em)
               break;
       }
       m=1;
    }
    
    //return
    return cnt;
}
</script>

댓글 없음:

댓글 쓰기