유용한 정보

달력 알고리즘

DevReff 2025. 3. 21. 13:01
728x90
728x90
SMALL
반응형


1. 요일을 숫자로 정의하기
  1년1월1일을 월요일이고 숫자로 1이라 정의하고
  일주일을 7일로 정의하면
 7일 % 7=0 == 일요일

  따라서 일요일 ~ 토요일은 0 ~ 6
이라고 정의한다.

2. 윤년 여부 판단하기
  윤년은 4년마다 발생하는데 예외가 있는데
  100년째에는 윤년이 아니고
  400년째에는 윤년이다.
  이것을 C코드로 표현하면 아래와 같다.

  if(Year%4 == 0 && Year%100 != 0 || Year%400 == 0)
  {
      printf("윤년입니다.");
  }

3. 요일 구하기
  오늘이 2025년 3월 21일이라면 2024년까지의 모든 일 수를 구하고

  2017*365 + ((2017/4 - 2017/100) + 2017/400)
  = 739,331

  이것은 4로 나누어지는 윤년이었던 해의 일 수를 더해주고 100으로 나누어지는 해의 일 수를 빼주고 400으로 나누어지는 윤년의 일 수를 더해준 값이 1년1월1일부터 직전해까지의 총일수다

  오늘 (2025년3월21일)이 무슨 요일인지 계산하면
  739,331 + 1월일수(31) + 2월일수(28) + 현재일(21)
  = 739,331 % 7 =
  = 5 (나머지값이다)
  따라서 2025년3월21일은 금요일이다.

4. 월의 일수 및 요일 구하는 C코드
// 주어진 년의 월의 일수 계산
int get_month_day(year, month)
{
    if (month == 4 or month == 6 or month == 9 or month == 11)
        return 30
    else if (month == 2)
   {
       if (year % 4 == 0 and year % 100 != 0 or year % 400 == 0)
            return 29
        else
            return 28
    }
    else
        return 31
}

// 1년1월1일부터 주어진 날짜까지의 총일수 계산
int get_total_day(year, month, day)
{
    // 1년1월1일부터 직전해까지의 총일수
    int year_days = (year-1)*365 + ((int((year-1)/4) - int((year-1)/100)) + int((year-1)/400));

    // 주어진 날짜까지 주어진 년의  총일수
    int month_days = 0
    for (int i=1; i <= month; ++i)
        month_days += get_month_day(year, i);

    return year_days + month_days + day;
}

// 주어진 일의 요일을 영문자 세자리로 표시
string get_weekday(day)
{
    day %= 7;
    if (day == 0)
        return 'SUN' ;
    if (day == 1)
        return 'MON' ;
    if (day == 2)
        return 'TUE' ;
    if (day == 3)
        return 'WED' ;
    if (day == 4)
        return 'THU' ;
    if (day == 5)
        return 'FRI' ;
    if (day == 6)
        return 'SAT' ;

      print(get_weekday(get_total_day(2025, 1, 30)));
}

728x90
728x90
LIST