문제 이해
3개의 수 E, S, M으로 나타낸 연도를 우리가 알고 있는 연도로 몇 년인지 구하는 문제다.
E, S, M의 범위는 각각 1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19이고, 1년이 지날 때 마다 각 수에 1을 더한다. E는 1에서 15까지의 숫자가 반복되는 것이고, S는 1에서 28까지의 숫자가, M은 1에서 19까지의 숫자가 반복되는 것이다.
예를 들어, 1 1 1년은 1년이고, 15 15 15는 15년, 1 16 16은 16년이다.
이 문제는 연도 - E = 15의 배수, 연도 - S = 28의 배수, 연도 - M = 19의 배수라는 것을 활용하면 된다. (참고)
증명
E = 1, S = 2, M = 3이고, 정답년도는 year라고 하자.
E에 E의 최대범위인 15를 더하면 다시 1이 된다. 그러므로 year = E + 15 * x 로 나타낼 수 있다.
S에 S의 최대범위인 28을 더하면 다시 2가 된다. 그러므로 year = S + 28 * y 로 나타낼 수 있다.
M의 경우도 동일하게 year = M + 19 * z가 된다.
E, S, M을 이항하면
year - E = 15 * x
year - S = 28 * y
year - M = 19 * z 이다.
구현
// 1476 날짜 계산
#pragma warning(disable: 4996)
#include <iostream>
using namespace std;
#define MAX_E 15
#define MAX_S 28
#define MAX_M 19
int E, S, M;
int year;
int main() {
scanf("%d %d %d", &E, &S, &M);
for (year = 1;; year++) {
if (!((year - E) % MAX_E) && !((year - S) % MAX_S) && !((year - M) % MAX_M)) {
break;
}
}
printf("%d", year);
return 0;
}
문제 링크: www.acmicpc.net/problem/1476
'ALGORITHM' 카테고리의 다른 글
백준 2564번 경비원 (0) | 2021.03.05 |
---|---|
백준 5014번 스타트링크 (0) | 2021.01.02 |
백준 1107번 리모컨 (0) | 2020.09.08 |
백준 1167번 트리의 지름 (0) | 2020.08.29 |