ex) E = 1, S = 2, M = 3
동일한 n에 대해 다음의 3가지 조건을 만족하는 n이 정답이라고 생각했다.
15*n + 1 == E && 28*n + 2 == S && 19*n == M
나머지 연산을 사용할 경우 위를 반대로 생각해서 E, S, M을 각각 15, 28, 19로 나눈 나머지를 n이라고 하면 n은 0부터 계속해서 1씩 증가하고, n%15 == E && n%28 == S && n%19 == M 3가지를 동시에 만족하는 n을 찾으면 된다.
하지만 이것마저도 오류가 좀 있다.
1. 대표적으로 E를 들면 n = 15/30/45/...15의 배수일 때 나머지는 0이 되는데, n=15라면 이것은 15가 되어야 한다. 그래서 나머지마 0이 되버리는 것을 방지하기 위해 적절하게 조작해주어야 한다. (S와 M도 마찬가지이다. n이 28의 배수이거나 n이 19의 배수일 때 나머지가 0이 되면 안 되고 28, 19로 남아있어야 한다.)
어떻게 조작할 것인가?
E) n = 15, n%15 = 15를 만들려면, n-1을 해주고 나오는 나머지 14에 대해 +1을 해준다.
=> n = 17, (n-1)%15 = 16%15 = 1 + 1 = 2(정답)
S와 M도 마찬가지이다.
이제 n을 0부터 1씩 계속해서 증가시키며 n%15==E-1 && n%28==S-1 && n%19==M-1 를 만족하는 n을 찾아서 n+1이 정답이 된다.
2. n이 0부터 시작하는 이유
입력받는 수 E,S,M에서 -1씩 해주고, n을 15,28,19로 나누었을 때 나머지 +1이 정답이 된다.
E, S, M이 숫자 그 자체로 1,1,1 이고 i는 1부터 시작하면 정답이 되지만 아래와 같은 오류가 있기 때문에 E-1,S-1,M-1을 해주기 때문ㅇ에 i도 1이 아닌 0부터 시작해야한다.
소스 코드 구현
importjava.util.*;publicclassCalculateDateESM_Modular_2nd{publicstaticvoidmain(String[]args){Scanner sc =newScanner(System.in);int E =sc.nextInt()-1;int S =sc.nextInt()-1;int M =sc.nextInt()-1;for(int i=0;;i++){//i가 1이 아니라 0부터 시작하는 이유 이해하기.if(i%15== E && i%28== S && i%19== M){//동일한 i에 대해 3가지 조건을 만족하면 System.out.println(i+1);break;}}}}