int leapYear(int year); void showDoomsDay(int year); int doomsDayOfYear(int year);
int main(void) { int year;
printf("Input years : "); scanf("%d", &year);
showDoomsDay(year);
return0; }
int leapYear(int year){ if(year%4==0){ if(year%100!=0)return1; elseif(year%400==0)return1; } return0; }// 윤달 확인 알고리즘
void showDoomsDay(int year) { char day[][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; printf("Doomsday(last day of Feb) of %d is %s.\n", year, day[doomsDayOfYear(year)]);
// 어이가 없어서 ㅡ,.ㅡ 배열 초기화 하는법과 사용법을 잊어버다니 미쳤어. // 공무원 수험서에서 사용법 찾아서 완성;; 쪽팔려. }
int doomsDayOfYear(int year){
/*
* 현재 이 알고리즘에는 문제가 있다!!!!!!!!!!!!!!!!!!
* 문제는 논리적으로 둠스데이 알고리즘이 0000년 부터 적용되는 알아 보아야 하며
* 구현한 알고리즘에 문제가 없는지 검증이 요구 된다.
* 현재 1000년 이후의 년도는 검증된 상태이다. (0~999년도 검증 요망)
*/
/*
* ex 1900년도의 둠스데이(2월의 마지막일 요일)는 3, 즉 수요일
* ex 1800년도의 둠스데이(2월의 마지막일 요일)는 5, 즉 금요일
* ex 1700년도의 둠스데이(2월의 마지막일 요일)는 0, 즉 월요일
* ex 1600년도의 둠스데이(2월의 마지막일 요일)는 2, 즉 화요일
*/
// ex 1901년 부터 1984년 까지 루핑하면서 윤년과 윤년이 아닌 해를 // 구분해 initOfDoomsday를 증가시킨다. // 해가 지나갈수록 요일은 하루씩 밀리게 되어 있으나 // 윤년이 있는 해는 2일이 밀리게 된다.
for(i=year-(year%100)+1; i<=year;i++){ if(leapYear(i)==0) initOfDoomsday++; else initOfDoomsday=initOfDoomsday+2; } // for문이 최소 0번에서 최대 99번 루핑을 하게 된다. // 최적화 할 수 있는 방법 생각해 볼 것 // 물론 최대 99번 루핑을 한다고 해서 루핑자체에 // 증가 연산만 있기 때문에 큰 문제가 있는건 아니지만 // leapYear(int year) 함수를 매번 호출 하기 때문에 // 함수가 속도의 크게 영향을 미친다.
// 증가된 initOfDoomsday를 7로 mod연산을 하게 되면 // 0~6의 수가 나오게 된다.(sun ~ sat)
return initOfDoomsday%7; }
사실 이 소스를 언제 만들었는지는 기억도 안난다.
연휴때 만든 소스인데 미공개 이었던 글을 지금에서야 공개를 하는 것이다.
ps. 글 내용을 보면 둠스데이에 관한 이야기는 추후에 다시 한다고 하였는데 그 약속은 못 지키거나
오랜 시간이 지난뒤에서야 지켜질 것 같다. 왜냐면 위 소스를 지금 분석도 못하는 바보가 되었기 때문이다.