C 언어로 둠스데이 알고리즘 구현하기

둠스데이 알고리즘 (C 언어)

둠스데이란?

둠스데이 알고리즘(Doomsday algorithm)은 존 호턴 콘웨이가 발명한 알고리즘으로, 임의의 날짜에 해당하는 요일을 쉽게 구하는 데에 쓰인다.
한 해에서 다음 날짜는 언제나 요일이 같다.

둠스데이 알고리즘 적용하기

  1. 해당 세기의 "기준일" 을 찾습니다.
  2. 기준일을 이용해서 해당 년도의 둠스데이를 계산합니다.
  3. 항상 둠스데이를 만족하는 날짜들중 (4/4, 6/6, 8/8 등) 찾고자 하는 날짜와 가장 가까운 날을 고르고, 해당 날짜와 찾고자 하는 날짜의 차를 구해 모듈로 연산을 합니다 (mod 7, C 언어에선 %7 해서 나오는 값). 해당 값을 세기 기준을에 더하면 날짜가 구해집니다.
    Doomsday_calendar
    Doomsday_Memorable_Date

해당 년도의 둠스데이 계산하기

다음 세기들은 해당 기준일을 가집니다.
1800~1899 는 금요일
1900~1999 is 수요일
2000~2099 is 화요일
2100~2199 is 일요일
그리고 그 이후 년도들은 금요일, 수요일, 화요일, 일요일 순으로 계속 반복됩니다.

해당 기준일을 가지고 원하는 년도의 둠스데이를 알아봅시다.
예를들어 2016년 3월 24일 의 날짜를 구해보겠습니다.

  1. 해당 년도의 끝 2자리 수를 12로 나눕니다. 2016년도는 16을 12로 나눠야 겠죠.
    16을 12로 나누면 1과 나머지 4가 남죠. 여기서 몫을 a 로 나머지를 b라고 하겠습니다.
  2. 나머지였던 b를 4로 나눕니다. 16을 12로 나눴을때 (나머지 = b) 는 4엿으니 4/4의 값을 c라고 해주세요.
    b/4 = 4/4 = 1, (c = 1)
  3. 자 이제 공식에 필요한 값들이 모엿습니다. 날짜를 찾아보죠.
    2016년은 2000~2099 사이에 속해있으니 기준일은 화요일이겠네요
    a,b,c를 모두 더해줍니다. a+b+c = 1+4+1 = 6
    이제 위의 계산에서 나온 숫자를 해당 세기의 기준일에 더해줍니다. 화요일에 6일을 더하니 결과는 월요일이겠네요
    실제로 2016년도의 둠스데이는 월요일 입니다.

원하는 날짜의 요일 구하기

자 이제 2016년도의 둠스데이는 월요일 이란걸 알았으니 구하고자 하는 날짜와 해당 날짜와 가장 가까운 둠스데이날의 차를 구해야합니다.

위의 예제의 2016년 3월 24일을 이용해 보겠습니다. 2016년은 월요일이 둠스데이였죠. 그리고 가장 가까운 둠스데이날은 2월 29일이네요. 윤년이라 28일이 아닌 29일 (2월의 마지막날) 이 둠스데이가 됩니다.

2016년의 첫날부터 2월 29일까지는 총 60일이고, 3월 24일까지는 총 84일 이네요. 그럼 이제 요일을 구하는건 해당 C 명령어로 충분히 가능합니다.

1
dayOfWeek = ((doomsday + DAYS_PER_WEEK) - (DAYS_PER_WEEK + ((daysToEndOfFeb - daysToInputDay) % DAYS_PER_WEEK))) % DAYS_PER_WEEK;

해당 명령어에 숫자들을 대입해 보겠습니다. 0 = 목요일
dayOfWeek = ((4 + 7) - (7 + ((60 - 84) % 7))) % 7;
= ((11) - (7 + (-3))) % 7;
= 7 % 7
= 0
= 목요일


해당 알고리즘 예제 다운로드

둠스데이 알고리즘을 구현한 C 파일을 밑의 링크에 접속하시면 보실수 있습니다. 링크

공유하기