백준 2948 - 2009년

1 minute read

문제링크

문제 접근

  • 2009년 1월 1일은 Thursday 임을 출력예시에서 확인한 후, 2009년 1월~12월의 1일에 해당하는 요일을 데이터화한다.
  • Monday(0) ~ Sunday(6) 와 같이 각 요일에 인덱스를 매칭시켜 vector 컨테이너에 대입한다.
  • 입력받은 달(M)의 1일에 해당하는 요일을 데이터에서 찾아내고 이를 기준으로, 구하고자 하는 날짜(D)의 요일을 찾는다.

의사코드(pseudo-code)

#define function
- void init(vector<string>& v)
	- v[0] = "Monday"
	- v[1] = "Tuesday"
	- v[2] = "Wednesday"
	- v[3] = "Thursday"
	- v[4] = "Friday"
	- v[5] = "Saturday"
	- v[6] = "Sunday"

#main
- int D, M
- cin >> D >> M
- int monthDay[12] = {3, 6, 6, 2, 4, 0, 2, 5, 1, 3, 6, 1} // the first day of each month
- vector<string> days(7)
- init(days)
- int idx = monthDay[M-1]
- int diff = D - 1
- int tmp = diff % 7
- idx += tmp
- if idx > 6
	- idx -= 7
- cout << days[idx] << "\n"

소스코드 및 분석

전체 코드

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void init(vector<string>& v) {
	v[0] = "Monday";
	v[1] = "Tuesday";
	v[2] = "Wednesday";
	v[3] = "Thursday";
	v[4] = "Friday";
	v[5] = "Saturday";
	v[6] = "Sunday";
}

int main()
{
	int D, M;
	cin >> D >> M;
	int monthDay[12] = { 3,6,6,2,4,0,2,5,1,3,6,1 }; // the first day of each month
	vector<string> days(7);
	init(days);
	int idx = monthDay[M - 1]; // 입력받은 달에 해당하는 1일의 요일
	int diff = D - 1;
	int tmp = diff % 7;
	idx += tmp;
	if (idx > 6)
		idx -= 7;
	cout << days[idx] << "\n";
}

  • 일주일의 주기는 7이므로 매월 1일과 입력받은 날짜(D)의 차이를 7로 나눈다.
  • 나머지가 0인 경우 현재 요일(idx)을 그대로 가져가고 1,2,..,6 인 경우 나머지만큼 건너뛴 요일을 선택한다.

다른 풀이

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	int d, m;
	cin >> d >> m;
	// 각 달의 일수
	vector<int> month = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	vector<string> days = { "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday" };
	
	// 1월 1일을 기준으로 날수를 계산
	int diff_month = m - 1;
	int diff_day = d - 1;
	for (int i = 0; i < diff_month; i++) {
		diff_day += month[i];
	}
	cout << days[diff_day % 7] << endl;
	return 0;
}

Leave a comment