사용자 도구

사이트 도구


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", &param_year, &param_month, &param_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