안녕하세요. 알고라파덕 입니다.
19번 문제 WEEKLYCALENDAR
이 WEEKLYCALENDAR라는 문제는 구현 문제입니다.
문제의 요점은 오늘의 날짜와 요일이 주어집니다.
ex) 7 27 Saturdady
ex) 7 27 Monday
그럼 여기서 이 날짜가 있는 주의 Sunday~ Saturday까지의 날짜를 출력하는 것입니다.
Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday순!
ex) 7 27일이 토요일이기 때문에
날짜는 21 22 23 24 25 6 27을 출력합니다.
ex) 7월 27일이 월요일이기 때문에
날짜는 26 27 28 29 30 31 1을 출력합니다.
WEEKLYCALENDAR
출처 : https://algospot.com/judge/problem/read/WEEKLYCALENDAR
문제
당신은 오랜 기간 동안 어머니로부터의 잔소리, TV 혹은 자기 계발 서적 등에서 떠드는 진부한 소리에 세뇌된 끝에 오늘부터 성실히 살기로 결심했다. 그 첫 번째 단계로, 주간 달력을 구매해서 매일 할 일을 달력에 적고 그대로 수행하기로 결정했다. 다음의 예처럼 말이다.
하지만 달력을 사러 나가려는 순간, 당신은 모든 것이 귀찮아졌다. 대신, 집에 굴러다니는 빈 노트에 펜으로 주간 달력을 그려서 대체하기로 결정했다. 그러자 또 다른 문제가 발생했는데 바로 당신이 각 요일이 며칠에 해당하는지 생각하기가 귀찮다는 것이다. 당신은 휴대폰으로 오늘이 몇 월 며칠이며, 무슨 요일인지 알았다. 천만 다행으로 당신을 귀찮게 하지 않는 점은 올해는 윤년이 아니라는 것이다. 이제 컴퓨터 프로그램을 작성하여 주간 달력에 들어갈 숫자들을 완성하라.
출력
각 테스트 케이스마다 한 줄씩 그 주의 주간 달력에 쓰여야 할 숫자 7개를 하나의 공백을 사이에 두고 일월화수목금토 순으로 출력한다.
예제 출력 21 22 23 24 25 26 27
27 28 29 30 31 1 2
28 29 30 31 1 2 3
27 28 29 30 31 1 2
27 28 29 30 31 1 2
생각해야 할 점
요일을 어떻게 구분할 것인가
Saturday가 맨마지막에 위치하는 글자인지
1. if문 확인
2. 배열 인덱스로 확인.
1월은 31일이고, 2월은 28일이고, 3월은 30일이 있다.
배열의 인덱스에 날짜 수를 넣어서 해결.
1월 1일에서 하루 전 날은 12월 31일 이다.
1. if문으로 확인.
2. 날짜수를 저장하는 배열의 1월 전칸에 31을 넣어준다.
소스 코드 해설 소스 해설 접기
소스 코드 확인
초기 설정
strcpy(Check[1], "Sunday");
strcpy(Check[2], "Monday");
strcpy(Check[3], "Tuesday");
strcpy(Check[4], "Wednesday");
strcpy(Check[5], "Thursday");
strcpy(Check[6], "Friday");
strcpy(Check[7], "Saturday");
미리 요일의 출력지점을 인덱스로 하여 저장해둔다.
int Cnt[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
날짜수를 저장해둔다.
입력 부분
scanf("%d %d %s", &Month, &Day, Text);
해결 부분
for(int i = 1; i<=7; i++)
{
if(strcmp(Check[i], Text) == 0)
{
point = i;
print[i] = Day;
break;
}
}
요일을 찾아 출력하는 위치(point )를 설정해둔다.
int temp = Day-1;
for(int i=point-1; i>=1; i--)
{
if(temp == 0) temp = Cnt[Month-1];
print[i] = temp;
temp--;
}
temp = Day+1;
for(int i=point+1; i<=7; i++)
{
if(temp > Cnt[Month]) temp = 1;
print[i] = temp;
temp++;
}
정해놓은 위치부터 왼쪽칸을 채우고, 오른쪽칸을 채운다.
왼쪽칸을 채울때에는 1월에서 12월로 넘어가는 부분을 해결하기위해서 Cnt[0]번째에 12월의 날짜수인 31을 넣어둔다.
소스 해설 접기
소스 코드 보기 소스 코드 접기
#include <iostream>
#include <string.h>
using namespace std;
void INPUT();
char Check[10][10];
int Cnt[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
int T;
scanf("%d", &T);
strcpy(Check[1], "Sunday");
strcpy(Check[2], "Monday");
strcpy(Check[3], "Tuesday");
strcpy(Check[4], "Wednesday");
strcpy(Check[5], "Thursday");
strcpy(Check[6], "Friday");
strcpy(Check[7], "Saturday");
while(T >= 1)
{
--T;
INPUT();
}
return 0;
}
void INPUT()
{
char Text[10];
int print[10] = {0};
int Month, Day;
scanf("%d %d %s", &Month, &Day, Text);
int point;
for(int i = 1; i<=7; i++)
{
if(strcmp(Check[i], Text) == 0)
{
point = i;
print[i] = Day;
break;
}
}
int temp = Day-1;
for(int i=point-1; i>=1; i--)
{
if(temp == 0) temp = Cnt[Month-1];
print[i] = temp;
temp--;
}
temp = Day+1;
for(int i=point+1; i<=7; i++)
{
if(temp > Cnt[Month]) temp = 1;
print[i] = temp;
temp++;
}
for(int i=1; i<=7; i++) printf("%d ", print[i]);
printf("\n");
}
소스 코드 접기