본문 바로가기

Computer Science/Algorithm

[BOJ 1476] 날짜 계산

접근 방식 : E, S ,M 값의 주기는 1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19 이다. 준규가 사는 나라의 년도를 X로 했을 때,  입력으로 주어지는 E,S,M은 X를 각 변수의 최대값으로 나눈 나머지라고 볼 수 있다. 즉, E를 예로 든다면 X = aM + E (M은 몫) 관계가 성립한다. 따라서 X의 값은 X-E, X-S, X-M 을 각각 15, 28, 19 로 나누었을 때 동시에 나머지가 0이 되는 숫자중 최솟값이다.


 1년도부터 시작해서 하나하나 체크하면서 X 값이 될 수 있는지 판단했다. 문제는 범위를 어디까지 돌려야하냐는건데 세 수의 주기를 보면 15,28,19 인데 이 세 수는 모두 서로소이다. 세 수가 모두 서로소 라는건 주기가 15*28*19라는 얘기다. 예를 들어 E,S,M 값의 순서쌍 (x, y, z) 가 n일이 지난 후 (x, y, z)로 왔다면 n은 반드시 15의 배수이면서 28의 배수이면서 19의 배수일 수 밖에 없다. 그래야 15로 나눈 나머지와 28로 나눈나머지와 19로 나눈 나머지가 같기 때문이다. 따라서 이 문제에서는 순서쌍이 7980개이고 따라서 7980개 이후로는 똑같은 순서쌍이 반복된다. 나는 그냥 10000으로 설정하고 반복문을 돌렸다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int E, S, M;
 
 
void solve() {
    for (int i = 1; i <= 10000; i++) {
        if (((i - E) % 15== 0 && ((i - S) % 28== 0 && ((i - M) % 19== 0) {
            cout << i << endl;
            return;
        }
    }
}
 
int main() {
 
    cin >> E >> S >> M;
    solve();
 
    return 0;
}
cs


반응형