본문 바로가기

ALGORITHM

백준 1476번 날짜 계산

문제 이해

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