둠스데이 알고리즘이라고 있단다.
둠스데이 알고리즘(Doomsday algorithm)은 존 호튼 콘웨이(John Horton Conway)가 발명한 알고리즘으로, 임의의 날짜에 해당하는 요일을 쉽게 구하는 데에 쓰인다. (라고위키가말했다.)
즉 그 해의 특정 날짜들(둠스데이?)의 요일을 계산하여 그 특정 날짜로부터 내가 구하고 싶은 날짜의 요일을 구하는 것이다.
유남생?
일단 둠스데이라 불리는 날들을 알아보자.
이 날들은 모두 같은 요일을 가지고 있다.
그러므로 계산하고 싶은 날짜랑 가까운 둠스데이로부터 날짜를 구하면 되겠다.
4월 4일
6월 6일
8월 8일
10월 10일
12월 12일
그리고,
5월 9일
9월 5일
7월 11일
11월 7일
2월의 마지막 날 (2월 28일이나 윤년이면 2월 29일)
1월 31일 (윤년의 경우는 1월 32일(=2월 1일))
3월 0일 (3월 1일의 전날. 2월의 마지막 날에 해당)
그리고 파이의 날
3월 14일
오 칼라풀 ㅋㅋㅋㅋㅋㅋㅋㅋ
다음은, 계산 순서를 일단 알아보겠다.
1. 그 해의 둠스데이들이 무슨 요일인지 계산한다.
2. 가까운 둠스데이로부터 목표 날짜의 요일을 계산한다. 끗
그럼 그 해의 둠스데이를 계산해보장. 일단 기준이 있다.
1800년부터 1899년까지는 금요일,
1900년부터 1999년까지는 수요일,
2000년부터 2099년까지는 화요일, (Y-Tue-K)
2100년부터 2199년까지는 일요일,
그레고리력이 400년마다 달력이 같아지므로,
2200년부터는 100년마다 금요일, 수요일, 화요일, 일요일 순서로 반복된다.
그레고리력이 왜 400년마다 같아지는지는 저 아래에서 다루겠다.
저 기준을 어떻게 사용하느냐,
일단 외워야 할 게 생긴다.
계산하고 싶은 날짜를 정한다.
##&&년 %%월 **일
1. 그 해의 아래 두 자리를 12로 나눈다.
&&÷12=a…b
몫:a, 나머지:b 라고 하자.
2. b를 4로 나눈다.
b÷4=c…x
몫:c 라고 하자.
3. ##&&해의 기준요일에서 a+b+c 만큼 지난 날의 요일이 둠스데이의 요일이 된다.
4. 둠스데이의 요일을 알았으니 목표 날짜의 요일을 계산하자. 끗
이 계산에는 윤년에 대한 계산이 들어가 있으므로 딱히 생각할 필요는 없다.
다만, 둠스데이로부터 날짜 계산할 때만 2-3월 넘어갈 때 조심하면 되겠당.
여기서 윤년이란 무엇인가. 짚고 넘어가자.
지구가 태양을 한 바퀴 도는 데에 걸리는 시간이 정확히 365일이 아니므로
일부러 하루 넣어주어 일 년을 366일로 만드는 해를 말한다.
자세히 말하면 4년에 한 번, 2월을 28일에서 29일로 만드는 해를 뜻한다.
그리고 그 윤년은,
그레고리력으로, 4의 배수의 해가 윤년이 되고
100의 배수는 평년으로 바꾸며
400의 배수는 다시 윤년이 된다. 읭?
1996년 윤년 2000년은 윤년
2100년 평년 2104년 윤년
ㅇㅋ?
즉 400년 주기로 97개의 윤년이 반복되며, 1년에는 평균 365.2425일이 들어 간다. 현재 (춘분점을 기준으로 한) 태양년은 약 365.242375일이기 때문에, 약 8000년마다 1일의 오차가 발생한다. (라고위키가말했다.)
~증명~
자, 요일을 계산하는 둠스데이 알고리즘이 맞는 식인지 알아보자 ㅋㅋㅋㅋ
2000년-2099년 기준으로 알아보겠다.
일단 2000-2099년은 화요일이 기준이랬다.
찾아보면 역시나 2000년의 둠스데이들이 화요일이당. 4월 4일(물론 모든 둠스데이) 화요일.
이게 기준임.
2000년은 그레고리력으로 400의 배수이므로 윤년이지만 무시 개무시.
위처럼 4월 4일을 기준으로 했을 때 윤년은 2월에 있으므로 무시할 수 있당.
2000년 4월 4일
↕365일차이(7로 나누면 나머지가 +1)
2001년 4월 4일
↕365일차이(7로 나누면 나머지가 +1)
2002년
↕365일차이(7로 나누면 나머지가 +1)
2003년
↕366일차이(7로 나누면 나머지가 +2)
2004년
↕365일차이(7로 나누면 나머지가 +1)
2005년
↕365일차이(7로 나누면 나머지가 +1)
2006년
↕365일차이(7로 나누면 나머지가 +1)
2007년
↕366일차이(7로 나누면 나머지가 +2)
2008년
↕365일차이(7로 나누면 나머지가 +1)
2009년
↕365일차이(7로 나누면 나머지가 +1)
2010년
↕365일차이(7로 나누면 나머지가 +1)
2011년
↕366일차이(7로 나누면 나머지가 +2)
2012년
↕365일차이(7로 나누면 나머지가 +1)
2013년
일단 쫘악 써봤다.
2000년 4월 4일을 기준으로 했을 때, 2012년 4월 4일은 며칠 차이?
(1+1+1+2)*3=15, 그러므로 2000년 4월 4일에서 하루 추가.
2024년은? 2일 추가.
2036년은? 3일 추가.
즉 12개씩 그룹으로 묶어서 2000+12*a 의 해는 2000년 같은 날짜의 요일보다 a개 더 세면 된다.
다음, 하나의 그룹안에서는?
a번째 그룹의 대표는 12로 나누어 딱 떨어지는 놈이다. 2000, 2012, 2024 같이.
그 놈을 기준으로 몇 년 떨어져 있냐를 따져보자.
2003년에서2004년으로 넘어갈 때, 2007년에서 2008년으로 넘어갈 때,
4년마다 윤년이 있으므로 +1 추가가 아닌 +2가 추가 된다.
그러므로 12년로 구성된 그룹안에서 또 다시 그룹 3개로 나뉘게 된다.
2000-2003년 그룹은 2000년을 기준으로 각각 0,1,2,3 일을 추가 하면 되고
(이 0,1,2,3 은 12로 나누었을 때 나오는 나머지 b 에 해당한다.)
(이 그룹은 b를 4로 나누었을 때 몫 c 가 0인 그룹)
2004-2007년 그룹은 4,5,6,7 에다가 1을 더 추가한 5,6,7,8 일이 된다.
(b를 4로 나누었을 때 몫 c 가 1인 그룹)
2008-2011년 그룹은 8,9,10,11 에다가 2를 더 추가한 10,11,12,13 일이 된다.
(b를 4로 나누었을 때 몫 c 가 2인 그룹)
(즉 4로 나눈 몫 c 가 그 그룹에 추가로 붙게 되는 것이다.)
정리하겠다.
일단 20&&년은, &&를 12로 나눈 몫, 즉 2000년을 기준으로 a번째 그룹에 있으면,
일단 a일을 추가한다.
&&를 12로 나누었을 때 나온 나머지 b와, 나머지 b를 4로 나누었을 때 나오는 몫 c를 더해주면 그 그룹의 기준해로부터 며칠을 더하면 되는지를 알려주는 값이 된다.
뭐 결국 2000년 4월4일 화요일로부터 (a+b+c)일 떨어진 날의 요일이,
20&&년의 4월4일의 요일이 된다.
증명 끝!
참고
http://adoda.tistory.com/3
http://blog.naver.com/PostList.nhn?from=postList&blogId=alwaysneoi&categoryNo=34¤tPage=4
http://ko.wikipedia.org/wiki/%EC%9C%A4%EB%85%84
엌ㅋㅋㅋㅋㅋㅋ위키에 생각치도 못한 단어가 숨어있다 엌ㅋㅋㅋㅋㅋㅋㅋ