2016년 1월 7일 목요일

요일 계산하기 프로그래밍

'누워서 읽는 알고리즘'을 읽고 있다. 나의 알고리즘 실력이 형편없다고 느껴서다.
역시 이 책에 나오는 알고리즘 문제를 풀고 있는데 형편없다는 것이 증명되고 있다.
쉽지 않다. 그래서 더더욱 이 책을 끝내야겠다는 생각이 들었다.
저자의 마인드가 마음에 든다.
85페이지의 프로그래밍 과제를 풀었다.
요일을 알아맞추는 프로그래밍 과제이다. C를 짜는 사람이므로 C로 풀었다.

결과는 얼추 맞는 것 같다. :-)
(ㅋㅋ 이건 뭐지. 이 프로그래머 같지 않은 문장이라니. 얼추 맞다니 ㅋㅋ)
  1 /*
  2 created at 9:50 AM Jan.8.2016
  3 by T.Y. Jin
  4 */
  5 #include <stdio.h>
  6
  7 #define WED_IDX 2
  8 #define DAYS    7
  9
 10 int main(int argc, char * argv[])
 11 {
 12         int i;
 13         int y, m, d;
 14         int dif_y, dif_m, dif_d;
 15         int d_idx;
 16         int n_leap_year;
 17         int is_leap_year;
 18         int cal_d;
 19                        // 0      1      2      3      4      5      6
 20         char* days[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
 21                      //  1   2   3   4   5   6   7   8   9  10  11  12
 22         int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 23
 24         if(argc < 4) {
 25                 printf("argc = %d\n", argc);
 26                 return 1;
 27         }
 28         y = atoi(argv[1]);
 29         m = atoi(argv[2]);
 30         d = atoi(argv[3]);
 31
 32         printf("%d.%d.%d\n", y, m, d);
 33
 34         // 2000.2.29 Tue
 35         // <-- 31 + 29 =  Tue
 36         // 1999.12.31 X day
 37         // (X + 60) % 7  --> Tue (1)
 38         // X = Fri (4)
 39         // 2000. 1. 1  Sat (5) <-- Ref Day
 40
 41         // check the valid year
 42         if (y < 2000) {
 43                 printf("Invalid year (%d)\n", y);
 44                 return 1;
 45         }
 46         // check the valid month
 47         if(m > 12) {
 48                 printf("Invalid month (%m)\n", m);
 49                 return 1;
 50         }
 51
 52         // years
 53         dif_y = y - 2000;
 54         printf("dif_y = %d\n", dif_y);
 55
 56         // is the leap day???
 57         n_leap_year = dif_y / 4;
 58         is_leap_year = (dif_y % 4 == 0) ? 1 : 0;
 59         printf("num leap year %d\n", n_leap_year);
 60         printf("is leap year %d\n", is_leap_year);
 61
 62         // check the valid date
 63         if (is_leap_year) {
 64                 if (m == 2) {
 65                         if (d > months[m-1]+1) {
 66                                 printf("Invalid 1 date (%d)\n", d);
 67                                 return 1;
 68                         }
 69                 } else {
 70                         if (d > months[m-1]) {
 71                                 printf("Invalid 2 date (%d)\n", d);
 72                                 return 1;
 73                         }
 74                 }
 75         }
 76         else {
 77                 if (d > months[m-1]) {
 78                         printf("Invalid 3 date (%d)\n", d);
 79                         return 1;
 80                 }
 81         }
 82
 83         // months
 84         for(i = 0; i < m - 1; i++) {
 85                 if(is_leap_year && i == 1) { // Feb recal
 86                         dif_m += months[i]+1;
 87                 } else {
 88                         dif_m += months[i];
 89                 }
 90         }
 91         printf("dif_m = %d\n", dif_m);
 92
 93         // days
 94         dif_d = (dif_y * 365) + dif_m + (d-1);
 95         dif_d += dif_y ? n_leap_year : 0;
 96         printf("dif_d = %d\n", dif_d);
 97
 98         // calculate the day
 99         cal_d = (dif_d + 5)  %  DAYS;
100         printf("cal_d = %s\n", days[cal_d]);
101
102
103         return 0;
104 }
                   

댓글 없음:

댓글 쓰기