'누워서 읽는 알고리즘'을 읽고 있다. 나의 알고리즘 실력이 형편없다고 느껴서다.
역시 이 책에 나오는 알고리즘 문제를 풀고 있는데 형편없다는 것이 증명되고 있다.
쉽지 않다. 그래서 더더욱 이 책을 끝내야겠다는 생각이 들었다.
저자의 마인드가 마음에 든다.
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 }