jungol:problem_1007
문제 번호: 1007
문제 제목: 달력
문제 URL: http://jungol.co.kr/problem.php?id=1007
내가 푼 코드
#include <stdio.h> int get_full_day_of_year(int year); int get_full_day_of_month(int year, int day); int get_day_of_week(int year, int month, int day); const char* get_text_of_week(int index_of_week); void test_case(); int main(int argc, char* argv[]) { int i = 0; int j = 0; int param_year = 2000; int param_month = 10; int param_day = 22; int day_of_week = 0; int day_blank = 0; int iter_day = 1; int full_day = 0; for (;;) { scanf("%d %d %d", ¶m_year, ¶m_month, ¶m_day); // Checking if parameter is valid if (param_year >= 2000 && param_year <= 2010 && param_month >= 1 && param_month <= 12) { full_day = get_full_day_of_month(param_year, param_month); if (full_day >= param_day && param_day > 0) { break; } } printf("INPUT ERROR!\n"); } full_day = get_full_day_of_month(param_year, param_month); day_of_week = get_day_of_week(param_year, param_month, param_day); day_blank = get_day_of_week(param_year, param_month, 1); printf("%d. %d\n", param_year, param_month); printf("sun mon tue wed thu fri sat\n"); for (i = 0; i < 6; i++) { for (j = 0; j < 7; j++) { if (day_blank == 0) { if (iter_day <= full_day) { printf("%3d ", iter_day); iter_day = iter_day + 1; } } else { printf("%3s ", " "); day_blank = day_blank - 1; } } printf("\n"); if (iter_day > full_day) { break; } } printf("%s\n", get_text_of_week(day_of_week)); //printf("argc: %d, argv: %s\n", argc, argv[0]); return 0; } void test_case() { printf("%d\n", get_full_day_of_month(2015, 1)); printf("%d\n", get_full_day_of_month(2000, 1)); printf("%d\n", get_full_day_of_year(2000)); printf("%d\n", get_day_of_week(2015, 8, 4)); printf("%s\n", get_text_of_week(get_day_of_week(2015, 8, 4))); printf("%s\n", get_text_of_week(get_day_of_week(2000, 10, 22))); } const char* get_text_of_week(int index_of_week) { static const char* day_of_week_table[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; return day_of_week_table[index_of_week]; } int get_day_of_week(int year, int month, int day) { int diff_date_from_2010 = 0; int i = 0; int mod_day_of_week = 0; // Checking diff day from 2010 year for (i = 2000; i < year; i++) { diff_date_from_2010 = diff_date_from_2010 + get_full_day_of_year(i); } for (i = 1; i < month; i++) { diff_date_from_2010 = diff_date_from_2010 + get_full_day_of_month(year, i); } diff_date_from_2010 = diff_date_from_2010 + day; // Make sure 2010/ 1/ 1 is Saturday // We can check this weekday // Because If you are today's day of week. // Checking day of week mod_day_of_week = diff_date_from_2010 % 7; switch (mod_day_of_week) { case 0: return 5; case 1: return 6; case 2: return 0; case 3: return 1; case 4: return 2; case 5: return 3; case 6: return 4; } return 0; } int get_full_day_of_year(int year) { int return_value = 0; int i = 0; for (i = 1; i <= 12; i++) { return_value = return_value + get_full_day_of_month(year, i); } return return_value; } int get_full_day_of_month(int year, int month) { int day_table[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int zero_base_month = month - 1; if (month == 2) { if (year % 400 == 0) { return 29; } else if ((year % 4 == 0) && (year % 100 != 0)) { return 29; } } return day_table[zero_base_month]; }
후기:
처음에 2000년 1월 1일에 대한 요일이 주어진 것을 보지 못하고, 현재 날짜에서 2000년 1월 1일에 대한 요일을 확인하는 것 부터 프로그램 작성을 시작했었음.
2000년 1월 1일에 대한 시작 요일이 결정 되고 나면, 2000년 1월 1일 부터 확인 하려는 날짜까지의 총 일 수를 구한다. 그 다음 확인 하려는 날짜와 그 달의 첫 시작 요일을 구하여 달력을 계산했다.
답을 제출하면서 느낀 것은, 문제 지문을 읽으면서 사용자로 부터 입력되는 값들의 예외 처리를 잘 했다고 생각했으나 빠트린 부분이 많았었다는 것을 알 수 있었다.
jungol/problem_1007.txt · 마지막으로 수정됨: 2015/08/04 23:47 저자 lindol