본문 바로가기
c언어/baekjoon.c

[1924] 2007년 (구현)

by 로토마 2021. 8. 25.

문제

오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

출력

첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.

 

풀이 로직)

1월 1일 부터 요구하는 요일까지의 일의 총합을 구하고 7로 나누었을 때의 나머지를 이용해 요일을 구했다.

 

- 일 수의 총합 구하기 

먼저 days[12] 배열을 만들어 총 12달의 일 수를 배열 형태로 저장했다.

int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

 

그 후 month와 date를 입력받고, 

int month;
int date;
scanf("%d %d", &month, &date);

 

입력받은 month 직전의 달까지의 일 수 만큼을 for문을 사용해,

total_days 변수에 누적해서 더해 주었다.

int total_days = 0;
for (int i = 0; i < month - 1; i++) 
    total_days += days[i];

 

그리고 해당 달의 입력받은 date까지 더해서 total_days를 구했다.
total_days += date;

 

- 해당 날짜의 요일 구하기

요일을 구하는 방법은 total_days를 7로 나눈 나머지를 구하고,

int ans;
ans = total_days % 7;

 

 남는 나머지 값에 따라 요일을 배정하면 된다!

(if 문 보다는 switch 문을 사용했을 때, 가독성이 좋아서 switch를 사용했다.) 

switch(ans)
{
case 1:
printf("MON");
break;
case 2:
printf("TUE");
break;
case 3:
printf("WED");
break;
case 4:
printf("THU");
break;
case 5:
printf("FRI");
break;
case 6:
printf("SAT");
break;
case 0:
printf("SUN");
break;
}

 

전체 코드)