젤러의 알고리즘(Zeller's Algorithm)은 주어진 날짜가 무슨 요일인지 계산하는 고전적인 방법입니다. 그레고리력 기준의 임의의 날짜를 입력하면 간단한 산술 연산만으로 해당 요일을 구할 수 있어, 달력 애플리케이션 개발이나 알고리즘 문제 풀이에 널리 활용됩니다.

공식에 사용되는 변수
위 공식은 다음과 같은 변수들로 구성됩니다.
- d — 날짜의 '일'에 해당하는 값입니다.
- m — 월 코드입니다. 3월부터 12월까지는 3~12를 그대로 사용하고, 1월은 13, 2월은 14로 취급합니다. 즉, 1월과 2월은 전년도의 13번째·14번째 달로 간주하며, 이 경우 연도 값에서 1을 빼야 합니다.
- y — 연도의 마지막 두 자리 숫자입니다.
- c — 연도의 첫 두 자리 숫자(세기)입니다.
- w — 최종 계산 결과로 얻는 요일 값입니다. 0이면 토요일, 1이면 일요일, 2이면 월요일처럼 순서대로 대응되며, 6이면 금요일을 의미합니다.
입력 및 출력 예시
입력: 일, 월, 년: 4, 1, 1997 출력: 해당 날짜는: 토요일(Saturday)
알고리즘 (의사코드)
zellersAlgorithm(day, month, year)
입력: 요일을 구하고자 하는 날짜
출력: 해당 날짜의 요일 (일요일~토요일)
Begin
if month > 2, then
mon := month
else
mon := 12 + month
decrease year by 1
y := last two digit of the year
c := first two digit of the year
w := day + floor((13*(mon+1))/5) + y + floor(y/4) + floor(c/4) + 5*c
w := w mod 7
return weekday[w] // weekday 배열에는 토요일부터 금요일까지 순서대로 저장
EndC++ 구현 예제
#include<iostream>
#include<cmath>
using namespace std;
// 인덱스 0부터 토요일~금요일 순서로 저장
string weekday[7] = {"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
string zellersAlgorithm(int day, int month, int year) {
int mon;
if(month > 2)
mon = month; // 3월~12월은 월 코드가 월과 동일
else {
mon = (12+month); // 1월과 2월은 각각 13, 14로 처리
year--; // 1월, 2월인 경우 연도에서 1 감소
}
int y = year % 100; // 연도의 마지막 두 자리
int c = year / 100; // 연도의 첫 두 자리
int w = (day + floor((13*(mon+1))/5) + y + floor(y/4) + floor(c/4) + (5*c));
w = w % 7;
return weekday[w];
}
int main() {
int day, month, year;
cout << "Enter Day: "; cin >> day;
cout << "Enter Month: "; cin >> month;
cout << "Enter Year: "; cin >> year;
cout << "It was: " << zellersAlgorithm(day, month, year);
}실행 결과
Enter Day: 04 Enter Month: 01 Enter Year: 1997 It was: Saturday
동작 원리 정리
이 알고리즘의 핵심은 1월과 2월을 '전년도의 13월, 14월'로 치환하는 것입니다. 이렇게 하면 윤년으로 인한 불규칙성을 하나의 공식으로 일관되게 처리할 수 있습니다. 참고로 C++에서 정수 나눗셈은 소수점 이하를 버리므로, 양수 범위에서는 floor() 함수와 동일하게 동작합니다.
실제로 1997년 1월 4일을 계산해 보면 다음과 같습니다. 1월이므로 월 코드는 13이 되고 연도는 1996으로 조정되어 y = 96, c = 19입니다. 공식에 대입하면 w = 4 + floor((13×14)/5) + 96 + floor(96/4) + floor(19/4) + 5×19 = 4 + 36 + 96 + 24 + 4 + 95 = 259이고, 259 mod 7 = 0이므로 '토요일'이라는 결과를 얻습니다. 실제로 1997년 1월 4일은 토요일이었습니다.