Notice
Recent Posts
Recent Comments
Link
궤도
[EPPER] 9회 2번 본문
문제
풀이
m월 d일을 입력하면 1월 1일로부터 며칠이 지나야 m월 d일이 될 지 계산하고 그 결과를 7로 나눠서 요일을 구했다.
처음엔 m월 1일마다의 요일을 구해서 저장할까...같은 노가다성이 짙은 생각을 했는데, 지금 생각해보면 제정신이 아니었나보다.
7월까지는 홀수 달이 31일이고 8월부터는 짝수 달이 31일이다. 1월부터 이에 맞춰 더해가다 m월이 되면 지금까지 더한 결과에 (d-1)을 더한다. 왜 d-1이나면 1월 '1일'부터 시작했기 때문이다.
최종 결과를 7로 나누고 나머지에 따라 switch문에서 해당 요일을 찾아줬는데 지금 생각해보니 차라리 요일을 배열에 저장했으면 코드가 더 짧아졌을 것 같다는 생각이 든다.
char day[7][10] = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
printf("%s\n", day[sum]);
대충 이런식으로 말이다. 아래 소스코드를 보면 알겠지만 sum은 일련의 계산을 통해 0~6사이의 값이 됐으니 아마 될 것 같다.
이 글을 쓰면서야 그런 간단한 방법이 생각났다.
소스코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int m, d;
scanf("%d %d", &m, &d);
int sum = 0; //1월 1일부터 몇 일이 지나야 해당 날짜가 될까
int start = 1; //1월부터 시작
while (1) {
if (start == m) { //해당 월까지 오면 day에서 1빼기
sum += (d - 1);
break;
}
if ((start <= 7 && start % 2 == 1) || (start > 7 && start % 2 == 0)) //7월까진 홀수 월, 8월부턴 짝수 월이 31일임
sum += 31;
else if (start == 2) //2월은 28일까지
sum += 28;
else //그 외는 전부 30일까지
sum += 30;
start++;
}
sum %= 7; //일주일은 7일
switch (sum) { //1월 1일이 일욜이니까 나누어 떨어지면 일욜인거고 아니면 그 뒤부터 월화~
case 0:
printf("일요일");
break;
case 1:
printf("월요일");
break;
case 2:
printf("화요일");
break;
case 3:
printf("수요일");
break;
case 4:
printf("목요일");
break;
case 5:
printf("금요일");
break;
case 6:
printf("토요일");
break;
}
}
Comments