출처: https://www.acmicpc.net/problem/1924
Approach
2007년 x월 y일은 어떤 요일인지 출력하는 문제이다.
e.g) 월요일 MON, 화요일 TUE, ... 일요일 SUN
LUT(Look up Table)를 활용하면 쉽게 구현할 수 있는 문제이다.
▶ [알고리즘] 시간 성능 향상을 위한 코드 최적화 (C/C++)
달마다 마지막 일수가 다르다.
그렇기에 문제에서 지정한 1월 1일 월요일로부터 몇 일 지났는지로 환산할 수 있다.
예를 들어 3월 13일로 예를 들어보자.
3월 13일은 1월 + 2월 + 13일이 경과한 시간으로
= 31 + 28 + 14 = 73일 (1월 1일로부터) 이다.
일주일 단위로 7일로 주기가 고정이므로
73 % 7 = 3 → 수요일(WED)에 해당한다.
즉, (1월 1일로 부터 경과한 일수) % 7 이다.
문제에서 요구한 내용을 수학적(?)으로 계산해주면 된다.
#include <iostream>
#include <string>
using namespace std;
int dayPerMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
string week[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
int m, d;
int main()
{
// freopen("input.txt", "r", stdin);
scanf("%d %d", &m, &d);
for (int i = 1; i < m; ++i)
{
d += dayPerMonth[i];
}
cout << week[d % 7] << endl;
}
수식을 이용하지 않는다면 아래와 같이 월별로 요일을 계산할 수도 있다.
나머지 이용(7 == 0 으로 생각)
1월: 1 2 3 4 5 6 7
2월: 5 6 7 1 2 3 4
3월: 5 6 7 1 2 3 4
4월: 2 3 4 5 6 7 1
5월: 7 1 2 3 4 5 6
6월: 4 5 6 7 1 2 3
7월: 2 3 4 5 6 7 1
8월: 6 7 1 2 3 4 5
9월: 3 4 5 6 7 1 2
10월: 1 2 3 4 5 6 7
11월: 5 6 7 1 2 3 4
12월: 3 4 5 6 7 1 2
#include <iostream>
using namespace std;
int main()
{
int m, d;
cin >> m >> d;
if (m == 2 || m == 3 || m == 11) {
d = d + 3;
}
else if (m == 4 || m == 7) {
d = d + 6;
}
else if (m == 9 || m == 12) {
d = d + 5;
}
else if (m == 6) {
d = d + 4;
}
else if (m == 8) {
d = d + 2;
}
else if (m == 5) {
d = d + 1;
}
if (d % 7 == 0) {
cout << "SUN";
}
else if (d % 7 == 1) {
cout << "MON";
}
else if (d % 7 == 2) {
cout << "TUE";
}
else if (d % 7 == 3) {
cout << "WED";
}
else if (d % 7 == 4) {
cout << "THU";
}
else if (d % 7 == 5) {
cout << "FRI";
}
else if (d % 7 == 6) {
cout << "SAT";
}
}
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 1155 변형 하노이 (0) | 2021.09.18 |
---|---|
[BOJ] 백준 1476 날짜 계산 (0) | 2021.09.18 |
[BOJ] 백준 1568 새 (0) | 2021.09.15 |
[BOJ] 백준 1550 16진수 (0) | 2021.09.14 |
[BOJ] 백준 1316 그룹 단어 체커 (0) | 2021.09.13 |
댓글