티스토리 뷰

기준요일 2020.1.1 수요일에 대한 상대적 날짜 계산을 통해 요일을 구한다. 년들의 날짜를 더할 때는 사실 윤년일 때 366, 아닐 때 365를 더하는 알고리즘으로 해도 되는데 조금 더 일반적인 달력계산 체계를 위해 모든 월을 더하는 알고리즘으로 작성했다. 실제로 쓸 때는 365,366으로만 작성하면 n time을 몇 개 줄일 수 있다.

 

/* 3/19에 수정함 */

생각해보니까 365는 7로 나누면 1임 그러므로 윤년이 아닌 해는 걍 동일 일에 대해서 한 요일만이 늦어질 뿐임. 이걸 생각하면 더 쉽게 짤 수 있음. 물론 아래 코드는 각 달의 일을 수정해서 계산할 수 있게 해서 조금 무식한 풀이임 하지만 다시 똑똑한 코드를 짜는게 너무 귀찮으니까 두겠음. 실제로 빠른 계산을 해야하는 사람은 밑의 코드를 참고하지 않길 바람

 

 

#include<iostream>
#include<string>
using namespace std;

string str_day[] = { "일", "월", "화", "수", "목", "금", "토" };
int month_day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

// 윤년인지 체크
void IsLeapYear(int year)
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		month_day[1] = 29;
	else { //윤년이 아닌경우도 생각해줘야..
		month_day[1] = 28;
	}
}

//2020 1.1-->수 기준요일로 계산
void printDay(int year, int month, int day) {
	int totalDay = 0;
	if (year < 2020) { //2020년 1월1일로부터 몇일 전인지 체크
		for(int i = 2019; i > year; i--) {
			IsLeapYear(i);
			for (int j = 0; j <= 11; j++) { //해당 년도의 모든 일을 더하기
				totalDay += month_day[j];
			}
		}
		IsLeapYear(year);
		//달의 차이 계산
		for (int i = month; i <= 11;i++) { //해당월 이후부터 12월까지의 일 계산
			totalDay += month_day[i];
		}
		totalDay += month_day[month - 1] - day+1;
		cout << str_day[(10 - (totalDay) % 7) % 7];
	}
	else { //year>=2020 /2020년 1월1일로부터 몇일이 흘렀는지 체크
		for (int i = 2020; i < year; i++) { //그 년도 전까지
			IsLeapYear(i);
			for (int j = 0; j <= 11; j++) { //해당 년도의 모든 일을 더하기
				totalDay += month_day[j];
			}
		}
		IsLeapYear(year);
		//달의 차이 계산
		for (int i = 0; i < month-1; i++) { //그 달의 날짜는 더하면 안됨
			totalDay += month_day[i];
		}
		//일 차 계산
		totalDay += day-1;
		cout << str_day[(totalDay + 3) % 7];
	}
}


int main() {
	int year, mon, day;
	cout << "년 월 일 입력:";
	cin >> year >> mon >> day;
	cout << year << "년 " << mon << "월 " << day << "일" << "은 ";
	printDay(year, mon, day);
	cout << "요일 입니다." << endl;
	
}

아니 근데 시발

댓글