두 개의 숫자 m(월)과 d(그 달 1일의 요일)가 주어졌다고 가정해 봅시다. 달력에서 요일은 열(column)로 표현되고, 날짜는 행(row)으로 표현됩니다. 우리가 구하고자 하는 것은 주어진 월 m과 그 달 첫날의 요일 d가 있을 때, 해당 달력을 완성하는 데 몇 개의 열이 필요한지입니다. (단, 윤년은 고려하지 않습니다.)
예를 들어 입력이 m = 11, d = 6이라면 출력은 5가 됩니다. 11월 1일이 토요일이고, 11월은 총 30일이므로 5개의 열이면 충분하기 때문입니다.
해결 접근 방법
이 문제는 다음 두 단계만으로 간단히 해결할 수 있습니다.
- 각 월의 일수를 저장한 크기 13의 배열 a를 정의합니다. 인덱스 0은 사용하지 않고, 인덱스 1부터 12까지 각 월의 일수를 담습니다.
- 공식 (a[m] + d + 5) / 7을 이용해 필요한 열의 개수를 계산하여 반환합니다.
Define an array a of size: 13 := { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
return (a[m] + d + 5) / 7공식의 원리: 1일이 시작되기 전까지 빈 칸이 d − 1개 필요하므로, 달력 전체 칸 수는 a[m] + (d − 1)입니다. 여기에 7을 더하고 나누어 올림 처리하면, 즉 (a[m] + d + 5) / 7의 정수 나눗셈 결과가 곧 필요한 열의 개수가 됩니다.
예제 코드
아래 구현 예시를 통해 더 자세히 이해해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
int solve(int m, int d){
int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return (a[m] + d + 5) / 7;
}
int main(){
int m = 11;
int d = 6;
cout << solve(m, d) << endl;
}입력
11, 6
출력
5