Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 특정 날짜의 요일 구하기: 젤러의 알고리즘 완벽 가이드

날짜(일, 월, 연도)가 주어졌을 때, 그 날짜가 무슨 요일인지 계산해야 하는 경우가 종종 있습니다. 이 문제는 젤러의 알고리즘(Zeller's Algorithm)을 사용하면 간단하게 해결할 수 있습니다.

젤러의 알고리즘 공식

주어진 날짜의 요일을 구하는 젤러의 공식은 다음과 같습니다.

w = (d + ⌊13(m+1)/5⌋ + y + ⌊y/4⌋ + ⌊c/4⌋ + 5c) mod 7

공식에 사용되는 변수

d — 날짜의 '일'을 나타냅니다.

m — 월 코드입니다. 3월부터 12월까지는 그대로 3~12를 사용하고, 1월은 13, 2월은 14로 치환합니다. 만약 1월이나 2월인 경우에는 해당 연도에서 1을 빼야 합니다.

y — 연도의 뒤 두 자리 숫자입니다.

c — 연도의 앞 두 자리 숫자입니다.

w — 계산된 요일 값입니다. 0이면 토요일, 6이면 금요일을 의미합니다.

예를 들어 1997년 1월 4일의 요일을 구한다면, 결과는 '토요일(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 will hold days from Saturday to Friday
End

C++ 구현 예제

위 알고리즘을 C++ 코드로 구현하면 다음과 같습니다.

#include<iostream>
#include<cmath>
using namespace std;
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);
}

실행 결과

입력

(4, 1, 1997)

출력

Enter Day: 4
Enter Month: 1
Enter Year: 1997
It was: Saturday

이처럼 젤러의 알고리즘을 활용하면 별도의 라이브러리 함수 없이도 주어진 날짜의 요일을 손쉽게 계산할 수 있습니다. 특히 달력 생성 프로그램이나 일정 관리 시스템을 개발할 때 유용하게 활용될 수 있습니다.