SFPC/2021

2021 SFPC E1

열정아빠와아들 2023. 2. 14. 12:59
#include <stdio.h>

// M = 달 별 마지막 날을 저장한 배열
// W = 요일들을 저장한 배열
int M[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
char W[7][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };

// 입력: 윤년을 확인할 년도 y
// 출력: 윤년이면 1, 아니면 0
int is_yun_year(int y)
{
	return (((y % 4) == 0) && ((y % 100 != 0)) || ((y % 400) == 0));
}

int main()
{
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);

	int num = 0;
	// a * b * c를 한 값에서 1까지 빼주며 최소공배수를 구해준다.
	for (int i = a * b * c; i >= 1; i--)
	{
		if (i % a == 0 && i % b == 0 && i % c == 0) num = i;
	}

	// year = 정답 년도, month = 정답 월, day = 정답일, week = 정답 요일
	// 초기값은 2100년 1월 1일 금요일
	int year = 2100, month = 1, day = 1, week = 5;
	while (1)
	{

		// 만약 is_yun_year 함수에서 결과가 1이 나오면 윤년이란 뜻인데
		// M[2]가 2월 달 끝부분이므로 29로 바꾼다.
		if (is_yun_year(year))
			M[2] = 29;
		else
			M[2] = 28; // 윤년이 아니면 28로 둔다.
		if (num >= M[month]) // 만약 현재 달의 마지막 날을 넘은 상황
		{
			num -= M[month]; // num에 달 수를 뺸다.
			week += M[month]; // 요일에 지난 달 수를 더해준다.
			week %= 7; // week를 7로 나눈 값의 나머지를 저장하여 요일값으로 업데이트한다.
			month++; // 달을 하나 올린다.
			if (month == 13) // 만약 month가 13이면 년도를 올려줘야 하므로
			{
				year++; // 년도를 올려주고
				month = 1; // 달을 1로 바꿔준다.
			}
		}
		else break; //num가 M[month]를 넘지 않으면 이 반복문을 나간다.
	}
	// week와 num을 더한 값에 7로 나눈 값의 나머지를 저장시키며 요일을 구해준다.
	week = (week + num) % 7;

	// 년도는 4칸에 맞춰서 출력하고
	// 월과 일은 2칸에 맞춰 출력한다.
	// 요일은 요일들이 있는 배열 W에서 골라 출력해준다.
	printf("%04d-%02d-%02d %s", year, month, day + num, W[week]);
}